题目求小于n不与n互质的正整数的和。
一个结论是小于n与n互质的正整数和=φ(n)*n/2。
- 因为如果a与n互质,那么n-a也与n互质,即若gcd(a,n)=1则gcd(n-a,n)=1,反证法即可证明。
- 也就是说小于n与n互质的数是成对的,且它们的和是n,共有φ(n)/2对。
- 所以小于n与n互质的正整数和=φ(n)*n/2。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int phi(int n){ 5 int res=n; 6 for(int i=2; i*i<=n; ++i){ 7 if(n%i) continue; 8 while(n%i==0) n/=i; 9 res-=res/i; 10 } 11 if(n!=1) res-=res/n; 12 return res; 13 } 14 int main(){ 15 int n; 16 while(~scanf("%d",&n) && n){ 17 printf("%lld ",((long long)n*(n-1)/2-(long long)n*phi(n)/2)%1000000007); 18 } 19 return 0; 20 }