题目链接: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)); } }