http://acm.hdu.edu.cn/showproblem.php?pid=3501
求小于n并且与n不互质的正整数之和。
欧拉函数用于求解1~n-1内与n互质的数的个数。
扩展: 1~n-1内与n互质的数之和为 eular(n)*n/2.
#include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #include <queue> #define LL long long #define _LL __int64 using namespace std; const int mod = 1000000007; int eular(_LL n) { int ret = n; for(int i = 2; i*i <= n; i++) { if(n%i == 0) { ret -= ret/i; while(n%i == 0) n /= i; } } if(n > 1) ret -= ret/n; return ret; } int main() { _LL n; while(~scanf("%I64d",&n) && n) { LL ans = n*(n+1)/2-n; ans -= eular(n)*n/2; ans %= mod; printf("%I64d\n",ans); } return 0; }