0
点赞
收藏
分享

微信扫一扫

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)

地址:​​https://www.acwing.com/problem/content/872/​​

课程没买的话,应该是看不了的,所以截个图。

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_#include

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_#include_02

 唯一分解定理:

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_#include_03

则N的约数个数就为:

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_约数个数_04

证明:P1^a1的约数个数为a1+1

P2^a2的约数个数为a2+1

.....

根据乘法原理,即为:

(1+a1)*(1+a2)....(1+an)

所以,把每一个乘数拆开来,求出它们的a1,a2....存在map里,最后的时候,套约数个数公式即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;
const int mod=1000000007;
const int inf=1e9;
int main()
{
map<int,int>mp;
int n;
cin>>n;
while(n--)
{
ll x;
cin>>x;
for(int i=2;i<=x/i;i++)
{
if(x%i==0)
{
while(x%i==0)
{
mp[i]++;
x=x/i;
}
}
}
if(x>1)
mp[x]++;
}
ll sum=1;
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)//!!!!!!!!!!!!!!!
{
sum=sum*(it->second+1)%mod;
}
cout<<sum<<endl;
}

 约数求和:

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_#include_05

 

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_#include_06

 计算公式:

约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)_i++_07

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;
const int mod=1e9+7;
const int inf=1e9;
int main()
{
map<int,int>mp;
int n;
cin>>n;
while(n--)
{
ll x;
cin>>x;
for(int i=2;i<=x/i;i++)
{
if(x%i==0)
{
while(x%i==0)
{
mp[i]++;
x=x/i;
}
}
}
if(x>1)
mp[x]++;
}
ll sum=1;
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
{
int p=it->first,a=it->second;
ll md=1;
ll kk=1;
while(a--)
{
kk*=p;
kk%=mod;
md+=kk;
md=md%mod;
}
sum=(sum*md)%mod;
}
cout<<sum<<endl;
}

 



举报

相关推荐

0 条评论