题意: 给你 N 和 K,问有多少个数对满足 gcd(N-A, N) * gcd(N - B, N) = N^K 分析: 由于 gcd(a, N) <= N,于是 K>2 都是无解,K=2 只有一个解 A=B=N,只要考虑 K = 1 的情况就好了 其实上式和这个是等价的 gcd(A, N) * gcd(B, N) = N^K,我们枚举 gcd(A, N) = g,那么gcd(B, N) = N / g。问题转化为统计满足 gcd(A, N) = g 的 A 的个数。这个答案就是 ?(N/g) 只要枚举 N 的 约数就可以了。答案是 Σ?(N/g)*?(g) g | N 计算 ? 可以递归,也可以直接暴力计算,两个都可以。
2 1 3 2
2 1HintFor the first case, (2, 1) and (1, 2) satisfy the equality.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int mod=(1e9+7);
long long int euler_phi(int n)
{
int m=(int)sqrt(n+0.5);
long long int ans=n;
for(int i=2;i<=m;i++)
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
int n,k;
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==1) puts("1");
else if(k>2) puts("0");
else if(k==2) puts("1");
else
{
long long int ans=0;
for(int g=1;g<=n;g++)
{
if(n<g*g) break;
if(n%g==0)
{
if(g!=n/g)
ans=(ans+(euler_phi(n/g)*euler_phi(g))%mod*2)%mod;
else
ans=(ans+(euler_phi(n/g)*euler_phi(g))%mod)%mod;
}
}
printf("%I64d\n",ans%mod);
}
}
return 0;
}
原文:http://blog.csdn.net/ck_boss/article/details/38822259