您的位置:首页 > 其它

HDU-2588-GCD

2017-09-25 10:00 381 查看
ACM模版

描述



题解

枚举 N 的大于等于 M 的约数 x,这样,gcd(N,x)≥M,最后的结果为所有 N/x 的欧拉函数之和。

设 y=N/x,欧拉函数是小于 y 并且与 y 互质的数的个数,这样 gcd(x∗pi,N) 依然是等于 x 的,这样就能避免重复计算。

代码

#include <stdio.h>
#include <math.h>

int Euler(int n)
{
if (n == 1)
{
return 1;
}

int x = 2, m = n, tmp = (int)sqrt(n);
while (x <= tmp)
{
if (m % x == 0)
{
n -= n / x;
while (m % x == 0)
{
m /= x;
}
tmp = (int)sqrt(m);
}
x++;
}
if (m != 1)
{
n -= n / m;
}
return n;
}

int solve(int n, int m)
{
int tmp = sqrt(n), ans = 0;
for (int i = 1; i <= tmp; i++)
{
if (n % i)
{
continue;
}

if (i >= m && i != tmp)
{
ans += Euler(n / i);
}
if (n / i >= m)
{
ans += Euler(i);
}
}

return ans;
}

int N, M;

int main()
{
int T;
scanf("%d", &T);

while (T--)
{
scanf("%d%d", &N, &M);
printf("%d\n", solve(N, M));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  欧拉函数