Basic Gcd Problem
题目描述:
作为一个伟大的ACMer,ZYB还擅长数学和数论。
ZYB构造了一个函数fc(x),使得:
给出一些正整数对(ni,ci),ZYB想知道fci(ni)mod(10^9+7)
输入描述:
输入包含多个测试用例。 输入的第一行包含一个整数T(1≤T≤10^6).
以下T行每行有两个整数ni,ci(1≤ni,ci≤10^6)描述一个问题
输出描述:
对于每个测试用例,输出一个整数来表示答案。
样例输入:
2
3 3
10 5
样例输出:
3
25
分析:
观察公式后不难发现函数fc(x)实际上求的是c的若干次方,且指数要尽量大。
所以本题的最优解就是每次只消掉一个质因子所以fc(x)=c^x的质因子个数。
正解:
预处理每个数的质因子数,然后再用快速幂求解
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int MAXN=1e6+5;
int a[MAXN]={0},t,n,c;
void hh(int x)
{
if(a[x]) return;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
hh(x/i);
a[x]=a[x/i]+1;
return;
}
a[x]=1;//素数
return;
}
ll ks(ll x,int y)
{
ll ans=1;
while(y)
{
if(y&1) ans=ans*x%mod;
y>>=1,x=x*x%mod;
}
return ans;
}//快速幂
int main()
{
for(int i=2;i<=1000000;i++)hh(i);//预处理i的质因子数
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&c);
printf("%lld\n",ks((ll)c,a[n]));
}
}