程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> hdu 3501 Calculation 2

hdu 3501 Calculation 2

編輯:關於C++

 

Calculation 2

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2570 Accepted Submission(s): 1073



Problem 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,求 1到n之中與n不互質的數的和

 

思路:先求互質的和,在用前n-1個數的和來減。

此處用到歐拉函數。(對於一個數n,在小於n的數中與n互質的數的個數)

一個關於gcd的定理。gcd(n,i)=1,那麼gcd(n,n-i)=1,互質的所有數的和,sum=(eular(n)*n/2) (n-i與i和為n,個數為eular/2個)

 

 

#include 
#include 
#include 
#include 
#include 
#include 
#define N 1000000001
#define mod 1000000007
using namespace std;

typedef long long ll;

ll eular(ll n)
{
    ll num=1;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            num*=(i-1);
            n/=i;
            while(n%i==0)
            {
                n/=i;
                num*=i;
            }
        }
    }
    if(n>1) num*=(n-1);

    return num;
}

int main()
{
    ll n;
    while(scanf(%d,&n),n)
    {
        ll ans;
        ans=n*(n+1)/2-n;

        ans-=(eular(n)*n/2);//由歐拉函數求出與n互質的數,減去互質數的和
        printf(%I64d
,(ans%mod+mod)%mod);
    }

    return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved