Description
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数
Input
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ;
Output
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
Sample Input
2 220 284 100 200
Sample Output
YESNO
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<climits> #include<string> #include<queue> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<climits> #include<string> #include<queue> #include<stack> #include<set> #include<map> #include<algorithm> using namespace std; #define rep(i,j,k)for(i=j;i<k;i++) #define per(i,j,k)for(i=j;i>k;i--) #define MS(x,y)memset(x,y,sizeof(x)) #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; const int INF=0x7ffffff; #define lson rt<<1, l, m #define rson rt<<1|1, m+1, r const int M=600000; int i,j,k,n,m; int flag[M]; int f(int x) { int i; int sum=0; for(i=1;i<=x;i++){ if(x%i==0){ if(!flag[i])sum+=(i+x/i); flag[i]=1; flag[x/i]=1; } } return sum; } int main() { scanf("%d",&n); while(n--){ int a,b; scanf("%d%d",&a,&b); MS(flag,0); int a1=f(a); MS(flag,0); int b1=f(b); if((a1-a)==b&&(b1-b)==a)printf("YES\n"); else printf("NO\n"); } return 0; }