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;
}
}
一个定理:
假设数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;
}
}
相关文章推荐
- Hdu 4497 GCD and LCM(数论)
- HDU 5943 Kingdom of Obsession(二分图匹配+数论)
- hdu 2136 数论+筛选质数+打表
- 数论学习初步(容斥原理学习&&hdu 1695&&hdu 5072)
- Beijing 2008 HDU - 1852 数论
- hdu——3292(数论之佩尔方程)
- 解题报告:HDU_3944 DP? 数论
- HDU 2104 hide handkerchief【数论】
- hdu 5505(数论-gcd的应用)
- HDU 5308 I Wanna Become A 24-Point Master(模拟+数论)
- HDU 1406 完数 (数论)
- HDU 6108 小C的倍数问题 (数论 2017百度之星初赛A第1题)
- HDU 5114 思维 + 数论
- HDU 4992 Primitive Roots 数论-求原根
- HDU 1085 Holding Bin-Laden Captive!(数论)
- HDU-5584-LCM Walk【2015上海赛区】【数论】
- HDU - 1098 - Ignatius's puzzle (数论 - 费马小定理)
- hdu 1222 (数论+递推)
- hdu 5514 Frogs 2015沈阳区域赛 数论 欧拉 好题 开心的题
- hdu_3063_Play game(数论)