[关闭]
@Chilling 2016-08-11T07:29:28.000000Z 字数 871 阅读 819

HDU-3501: Calculation 2(欧拉函数)

数论


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并且与n不互质的数的和。

分析:欧拉函数求出phi(n),小于n并且与n互质的数的和为:n*phi(n)/2。小于n的所有数的和减去与n互质的数的和。


  1. #include<stdio.h>
  2. #include<math.h>
  3. #define LL long long
  4. #define MOD 1000000007
  5. LL phi(LL n)
  6. {
  7. //LL m=(LL)sqrt(n+0.5) //开方很慢,265ms
  8. LL ans=n;
  9. for(LL i=2;i*i<=n;i++) //写成i*i<=n而不是i<=m,15ms
  10. if(n%i==0)
  11. {
  12. ans=ans/i*(i-1);
  13. while(n%i==0)
  14. n/=i;
  15. }
  16. if(n>1)
  17. ans=ans/n*(n-1);
  18. return ans;
  19. }
  20. int main()
  21. {
  22. LL n;
  23. while(scanf("%lld",&n),n)
  24. {
  25. // n*phi(n)/2 小于n且与n互质的数的和
  26. printf("%lld\n",(n*(n-1)/2-n*phi(n)/2)%MOD);
  27. }
  28. return 0;
  29. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注