小於n的數中與n互質的數的和
阿新 • • 發佈:2019-01-28
題意:
給一個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<stdio.h> #include<string.h> #define ll long long #define mod 1000000007 ll eular(ll n){ ll ret=1,i; for (i=2;i*i<=n;i++) if (n%i==0){ n/=i,ret*=i-1; while (n%i==0) n/=i,ret*=i; } if (n>1) ret*=n-1; return ret; } int main() { ll n; while(scanf("%lld",&n),n) { ll t1=(n-1)*n/2; ll t2=eular(n)*n/2; ll sum=((t1-t2)+mod)%mod; printf("%lld\n",sum); } }