题意:有一个构造的函数
给出n,c,求出fc(i)的值取余1e9+7的答案。
思路:我们对n和c进行操作,因为求max c*fc(gcd(i,x))的最大值,gcd最大值的话,如果x是素数,那么就是1,如果不是素数,那么就是循环找出第一个能被整除的数,x/这个数就是最大的i,然后进行递归继续找,直到x=1的时候返回1。答案在进行的时候要一直对mod取余。
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod=1e9+7;
int n,c;
int sushu(ll num)//素数的判断
{
if(num == 1) return 0;
if(num ==2|| num==3 ) return 1 ;
if(num %6!= 1&&num %6!= 5) return 0 ;
int tmp =sqrt( num);
for(int i= 5;i <=tmp; i+=6 )
if(num %i== 0||num %(i+ 2)==0 )return 0 ;
return 1 ;
}
ll work(int xx,int cc)//递归
{
if(xx>1)
{
int p;
if(sushu(xx)==1){
p=1;//素数就直接是1了
}
else{
for(int i=2;i*i<=xx;i++){//找i与xx的最大gcd,xx能整除的最大数,就xx/最小的整除数
if(xx%i==0){
p=xx/i;break;
}
}
}
return (work(p,cc)*cc)%mod;//继续递归
}
else if(xx==1){//递归出口
return 1;
}
}
int main ()
{
//ios::sync_with_stdio(false);
int t;
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&c);
ll ans=work(n,c);
printf("%lld\n",ans%mod);//答案
}
return 0;
}