牛客多校第四场 B-Basic Gcd Problem【线性筛+快速幂】

目录

  • 题意
  • 解题思路
  • 代码

题意

  • 链接:Basic Gcd Problem
  • 给出n、c,求出函数fc(n)的值
    牛客多校第四场 B-Basic Gcd Problem【线性筛+快速幂】_第1张图片

解题思路

  • 观察函数我们可以发现fc(n)=ccnt其中cnt为函数fc(x)的迭代次数,要想使fc(x)越大则迭代次数要越多即递归得越久
  • 怎么才能递归越久呢?
    看到gcd我们就能想到分解x的质因子,每消耗掉一个质因子就会递归一次,所以cnt=x的质因子数
    例如:8 = 2 * 2 * 2
    第一次 gcd(8,4)=4 消耗一个2
    第二次 gcd(4,2)=2 消耗一个2
    第三次 gcd(2,1)=1 消耗一个2
  • 用线性筛预处理出每个数的最大质因子,然后不断地去除该数的最大质因子,就能得到该数地质因子个数即cnt

代码

#include
#include
using namespace std;
typedef long long ll;
const int N=1e6+6;
const int mod=1e9+7;
int f[N];//f[i]表示i的最大质因子
int prime[N],vis[N];
void init()
{
	vis[1]=1;int cnt=0;
	for(int i=2;i<N;i++)
	{
		if(!vis[i])//i是质数 
		{
			prime[cnt++]=i;
			f[i]=i;
		}
		for(int j=0;j<cnt&&i*prime[j]<N;j++)
		{
			f[i*prime[j]]=prime[j];
			vis[i*prime[j]]=1;
            if(i%prime[j]==0)break;
		}
	}
}
ll power(ll a,ll b)
{
	ll res=1;
	while(b) 
	{
		if(b&1)res=1ll*res*a%mod;
		a=1ll*a*a%mod;b>>=1;
	}
	return res%mod;
}
int main()
{
	int t,n,c;
	init();
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&c);
		if(!vis[n]){
			printf("%lld\n",c%mod);
		}else{
			int cnt=0;
			while(n!=1)
			{
				n/=f[n];
				cnt++;
			}
			printf("%lld\n",power(c,cnt)%mod);
		}
	}
	return 0;
} 

你可能感兴趣的:(#,7.20第四场)