题目分析:
主要就是这个公式,我们分析一下,这是一个迭代公式,直到x=1
的时候才会结束。
每次迭代都会乘上c
的值,所以迭代n
次就有n个c
相乘,也就是c的n次方,主要求解迭代次数
也就是寻找n
质因子的个数cnt
,
for(int i=2;i*i<=n;i++)
{
while (n%i==0)
{
cnt++;
n/=i;
}
}
求幂的话防止数据比较大用快速幂
ll qpow(ll x,ll y,ll mod)
{
ll res=1;
while(y)
{
if(y&1) res=(res*x)%mod; //如果是奇数
x=(x*x)%mod;
y>>=1; //右移
}
return (res+mod)%mod;
}
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int mod = 1e9 + 7;
#define ll long long
ll qpow(ll x,ll y,ll mod)
{
ll res=1;
while(y)
{
if(y&1) res=(res*x)%mod;
x=(x*x)%mod;
y>>=1;
}
return (res+mod)%mod;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int cnt=0;
int n,c;
cin>>n>>c;
for(int i=2;i*i<=n;i++)
{
while (n%i==0)
{
cnt++;
n/=i;
}
}
if(n>1) cnt++;
ll ans=qpow(c,cnt,mod);
cout<<ans<<"\n";
}
return 0;
}
注意:
除了求幂的数据用long long
,主函数的其他数据不要用,牛客会卡内存~~~~