我们知道求两个数最大公约数的一种方法叫辗转相除法。并且当两个数的最大公约数为1时,我们就称这两个数互质。cxw喜欢数学,现在他遇到一个问题正准备向数学大牛daxia请教:“给定一个正整数n,在所有小于n的正整数中,求与n的最大公约数为d的所有的数的和.”,你能帮他解决这个问题吗? Input 有多组输入数据,每组数据有两个正整数n,d. 其中1< n <=10000000, 1 <= d < n, 数据保证n能被d整除. Output 对于每组数据,输出相应的结果 Sample Input 4 2 9 1 Sample Output 2 27 Hint: N = 9, d = 1 Answer: 1 + 2 + 4 + 5 + 7 + 8 = 27; #include<iostream> #include<stdio.h> using namespace std; int main() { long n,d,k,i,t,r,m; long long sum; while(scanf("%ld%ld",&n,&d)!=EOF) { k=1;sum=d; for(i=2;i*d<n;i++) if(n%(i*d)==0) { k=i*d; break; } for(i=2;i*d<n;i++) { if((i*d)%k==0&&k!=1&&k!=d) continue; t=i*d;m=n; r=m%t; if(r<d) continue; while(r!=0) { m=t; t=r; r=m%t; if(t<d) break; } if(t==d) sum+=i*d; } printf("%lld/n",sum); } return 0; }