标签:des style blog http color java os io strong
题意: 给你 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; }
标签:des style blog http color java os io strong
原文地址:http://blog.csdn.net/ck_boss/article/details/38822259