传送门
本题主要在于函数公式的理解:
想要让gcd(i,x)尽可能多。当嵌套层数最多时即为x的质因数个数。
步骤:
- 求n的质因数个数:
算术基本定理,又称为正整数的唯一分解定理,
即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后
写法仅有一种方式。
:一个数的质因子不会超过这个数的算数平方根。
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
cnt++;
n/=i;
}
}
if(n>1) cnt++;//如果n>1,那么剩下的n也为质数,cnt加1
- 快速幂求模:
ll Mode(ll x,ll y)
{
ll sum=1;
while(y)
{
if(y&1) sum=(sum*x)%mod;
y/=2;
x=(x*x)%mod;
}
return sum;
}
整体代码:
#include<iostream>
#include<cstdio>
using namespace std;
int t,n,c;
#define ll long long
const ll mod=1e9+7;
ll Mode(ll x,ll y)
{
ll sum=1;
while(y)
{
if(y&1) sum=(sum*x)%mod;
y/=2;
x=(x*x)%mod;
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
while(t--)
{
int cnt=0;
cin>>n>>c;
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
cnt++;
n/=i;
}
}
if(n>1) cnt++;
//ll ans=Mode(c,cnt,mod);
cout<<Mode(c,cnt)<<endl;
}
return 0;
}