题意:
给一个n,求
少于或等于n的数中与n不互质的数的和
我们先求
少于或等于n的数中与n互质的数的和
对于i与n互素
gcd(n,i)=1
必有gcd(n,n-i)=1
设n的欧拉函数值为f[n]
则有f[n]个数与n互素,这些数两两相加必等于n
于是有答案为f[n]*n/2
#include<iostream> #include<algorithm> #include<cstdio> #define MOD 1000000007 using namespace std; long long euler(long long n)//求n的欧拉函数 { long long ans=1,i; for(i=2;i*i<=n;i++) if (n%i==0) { ans*=i-1; n/=i; while(n%i==0) { ans*=i; n/=i; } } if (n>1) { ans*=n-1; } return ans; } int main() { long long n; while(scanf("%lld",&n),n) { if(n==2) { printf("0\n"); continue; } long long ans=n*(euler(n)/2); ans=ans%MOD; ans=n*(n+1)/2-ans-n; ans=ans%MOD; printf("%lld\n",ans); } return 0; }