2020牛客暑期多校训练营第四场Basic Gcd Problem

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
#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]));
    }
}

你可能感兴趣的:(2020牛客暑期多校训练营第四场Basic Gcd Problem)