您的位置:首页 > 其它

HDU 2040 亲和数 -数论

2018-03-13 20:12 295 查看
链接:2040
一个定理:
假设数N可以素数分解为P1^X1+P2^X2.....Pn^Xn,其中Pi为素数Xi为正整数
则数N的因数和为(1+P1+P1^2...+P1^X1)*(1+P2+P2^2...+P2^X2).....*(1+Pn+Pn^2...+Pn^Xn)
举个例子
220=2^2+5^1+11^1
则220的因数和为(1+2+4)*(1+5)*(1+11)=504
真因数和为504-220=284
然后这道题就直接因数分解后用公式求出因数和分别判断一下就OK了#include<bits/stdc++.h>
using namespace std;

const int maxN=666666;

bool vis[maxN];
vector<int> all;
int cnt[maxN];

int sum(int a,int b){
int ans=1,u=a;
while(b--){
ans+=u;
u*=a;
}
return ans;
}

int main(){
memset(vis,0,sizeof(vis));
for(long long i=2;i<maxN;i++)if(vis[i]==0){
for(long long j=i*i;j<maxN;j+=i)vis[j]=true;
}
for(int i=2;i<=600000;i++)if(vis[i]==0)all.push_back(i);
int n,p,u,v,a,b;
cin>>n;
while(n--){
cin>>p;u=p;
memset(cnt,0,sizeof(cnt));
for(int i=0;i<all.size();i++)while(p%all[i]==0){
cnt[i]++;
p/=all[i];
}
a=1;
for(int i=0;i<all.size();i++)if(cnt[i])a*=sum(all[i],cnt[i]);
a-=u;
cin>>p;v=p;
memset(cnt,0,sizeof(cnt));
for(int i=0;i<all.size();i++)while(p%all[i]==0){
cnt[i]++;
p/=all[i];
}
b=1;
for(int i=0;i<all.size();i++)if(cnt[i])b*=sum(all[i],cnt[i]);
b-=v;
if(a==v&&b==u)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: