HDU 3501 Calculation 2 (欧拉函数)

来源:互联网 发布:2017金英杰免费网络课 编辑:程序博客网 时间:2024/04/30 18:30
C - Calculation 2
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 3501

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

340
 

Sample Output

02
 



简单思路:首先用一下欧拉函数Eluar(n)求一下1-n中与n互质的质因子的个数,然后就要用到下面简单的定理了:如果gcd(n,i)==1,那么就有gcd(n,n-i)==1;

于是题目的要求是要求小于n并且与n不互质的所有数的和,这里我们可以先求与n互质的所有数的和为sum=n*Eular(n)/2 (这里用到了上面的定理)。最后所有数的和 (n-1)*n/2 减去 sum 即可。



//User: ZXPxx//Memory: 1604 KBTime: 0 MS//Language: C++Result: Accepted#include<cstdio>const int mod=1000000007;int eular(int n){    int cnt=1,i;    for(i=2;i*i<=n;i++)        if(n%i==0)    {        cnt*=i-1;        n/=i;        while(n%i==0)        {            n/=i;            cnt*=i;        }    }    if(n>1)        cnt*=(n-1);    return cnt;}int main(){    __int64 n;    while(~scanf("%I64d",&n),n)    {        __int64 ans=(n-1)*n/2;        __int64 sum=n*eular(n)/2;        ans-=sum;        printf("%I64d\n",ans%mod);    }    return 0;}


                                             
0 0
原创粉丝点击