HDU 3501 Calculation 2(欧拉函数)

题目地址:点击打开链接

思路:题目是要求小于n且不与n互素的和对1000000007取模,我们可以把可以用1到n-1的和(n-1)*(n-1+1)/2减去小于n且与n互素的和再对1000000007取模即可,这里要用到一个公式如果gcd(n,i)=1,则gcd(n,n-i)=1,用欧拉函数求出小于n且与n互素的个数为sum,则共有sum/2对数,他们的和为n,即小于n且与n互素的数的和为n*sum/2

AC代码:

#include <iostream>
#include <cstdio>

using namespace std;

long long fun(long long n)
{
    int i;
    long long rea = n;
    for(i=2; i*i <=n; i++)
    {
        if(n % i == 0)
        {
            rea -= rea / i;
            while(n % i == 0)
                n /= i;
        }
    }
    if(n > 1)
        rea -= rea / n;
    return rea;
}

int main()
{
    long long m,sum = 0;
    while(scanf("%I64d",&m) && m)
    {
        sum = ((m-1) * m / 2 - m * fun(m) / 2) % 1000000007;//如果怕溢出先除以2则需要判断第一个要除以的数能否被2整除,不然会出错
        printf("%I64d\n",sum);
    }
    return 0;
}


大神地址:点击打开链接


你可能感兴趣的:(HDU 3501 Calculation 2(欧拉函数))