NYOJ998---Sum

Sum

链接:NYOJ998

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述 给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x ,  N  ) >= M

求解gcd(x,N)的和

思路:枚举n的因子。

假设n的因子为d。d*gcd(x/d,n/d)=1。

d*Euler(n/d)就是因子为gcd(x,n)=d,从而求gcd(x,n)的和。


/************
Author:jiabeimuwei
Times:4ms
Sources:NYOJ998
************/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
using namespace std;
//#include<windows.h>
//#include<conio.h>
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))
#define malloc(sb) (sb *)malloc(sizeof(sb))
#define EPS             1e-8
#define DINF            1e15
#define MAXN            100050
#define MOD             1000000007
#define  LL long long
LL Euler(LL n)//欧拉函数
{
    LL i,c=n;
    for(i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            while(n%i==0) n=n/i;
            c=c/i*(i-1);
        }
    }
    if(n!=1) c=c/n*(n-1);
    return c;
}
int main()
{
    LL n,m;
    while(~scanf("%lld%lld",&n,&m))
    {
        int count;
        LL i,c=0;
        for(i=1; i*i<=n; i++)
        {
            if(n%i==0)
            {
                if(i>=m)
                {
                    count=i;
                    c=c+count*Euler(n/count);
                }
                if(i*i!=n&&n/i>=m)//枚举i与n的因子。
                {
                    count=n/i;
                    c=c+count*Euler(n/count);
                }
            }
        }
        printf("%lld\n",c);
    }
    return 0;
}




你可能感兴趣的:(算法,数论,C语言,ACM,nyoj)