题目链接:https://ac.nowcoder.com/acm/contest/5669/B
解题思路:
我们可以直接看出当x每次都只去掉一个质因子,fc=c^(x的素因子个数),本题T是1e6因此直接欧拉筛打表好了,维护一下素因子个数。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int MAXN = 1e6+7;
typedef long long ll;
ll quick_pow(ll a, ll b, ll m){
ll ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
int prime[MAXN], cnt;
bool vis[MAXN];
int fac[MAXN];
void Prime()
{
for(int i = 2; i <= MAXN; i++) {
if(!vis[i]) {
prime[++cnt] = i; fac[i] = 1;
}
for(int j = 1; j <= cnt&&i * prime[j] <= MAXN; j++) {
vis[i * prime[j]] = 1;
fac[i * prime[j]] = fac[i] + 1;
if(i % prime[j] == 0) break; //当 i是prime[j]的倍数时,i = kprime[j],如果继续运算 j+1,i * prime[j+1] = prime[j] * k prime[j+1],这里prime[j]是最小的素因子,当i = k * prime[j+1]时会重复,所以才跳出循环。
}
}
}
int main()
{
int t;
Prime();
scanf("%d",&t);
while(t--)
{
ll n, c;
scanf("%lld%lld",&n,&c);
printf("%lld\n",quick_pow(c,fac[n],mod));
}
}
京公网安备 11010502036488号