给出一组n和k,求解满足公式:gcd(n-a,n)*gcd(n-b,n)=n^k的(a,b)的对数,结果对(1e9+7)取模
//gcd(n-a,n)=e gcd(a,n)=f e=f
// e|n-a e|n e|a e<=f
// f|a f|n f|n-a e>=f e=f
// gcd(n-a,n)*gcd(n-b,n)=gcd(a,n)*gcd(b,n)=n^k
// k>2 无解
// k=2 a=n,b=n;
// k=1 gcd(a,n)=x 时 gcd(b,n)就要等于=n/x 枚举n的约数x即可
//gcd(n-a,n)=e gcd(a,n)=f e=f
// e|n-a e|n e|a e<=f
// f|a f|n f|n-a e>=f e=f
// gcd(n-a,n)*gcd(n-b,n)=gcd(a,n)*gcd(b,n)=n^k
// k>2 无解
// k=2 a=n,b=n;
// k=1 gcd(a,n)=x 时 gcd(b,n)就要等于=n/x 枚举n的约数x即可
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
const int N=1e6+20;
const int mod=1e9+7;
typedef long long ll;
ll a,b;
ll Euler(ll n)
{
ll m=sqrt(n+0.5);
ll 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 main()
{
ll n,k;
while(cin>>n>>k)
{
if(n==1)
{
cout<<1<<endl;
continue;
}
if(k>2)
cout<<0<<endl;
else if(k==2)
cout<<1<<endl;
else
{
ll ans=0;
for(int i=1;i*i<=n;i++)
{
//gcd(n,a)=x 有多少个a满足呢?
// gcd(n/x,a/x)=1 与n/x互质的有多少个就有多少个a->phi[n/x]个
if(n%i==0)
{
int a=Euler(n/i);
int b=Euler(i);
if(i*i==n)
ans+=a*b;
else
ans=(ans+2*a*b)%mod;//调换位置
}
}
cout<<ans%mod<<endl;
}
}
return 0;
}