Description
Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1.
Input
For each test case, there is a line containing a positive integer N(1 ≤ N ≤ 1000000000). A line containing a single 0 follows the last test case.
Output
For each test case, you should print the sum module 1000000007 in a line.
Sample Input
3 4 0
Sample Output
0 2
运用欧拉函数求与n互质的数的总和:phi[n]*n/2;
证明:在1<x<n中,与n互质的数有{x1,x2,x3....,xn},gcd(x,n)=gcd(n-x,n)=1,得:
{n-xn,....n-x2,n-x1},两个集合两两对应,相加除以2得phi[n]*n/2;
代码如下:
#include <stdio.h> #include<math.h> #include <string.h> long long phi(long long n) { long long res=n; for(int i=2; i*i<=n; i++) { if(n%i==0) { res=res-res/i; do n/=i; while(n%i==0); } } if(n>1) res=res-res/n; return res; } int main() { long long n,ans; while(scanf("%I64d",&n) != EOF) { if(n==0) break; ans=n*(n+1)/2-n; ans-=phi(n)*n/2; ans=ans%1000000007; printf("%I64d\n",ans); } return 0; }
时间: 2024-12-17 21:44:55