牛客暑假多校训练营(第四场)B-Basic Gcd Problem-递归,素数,gcd

在这里插入图片描述
在这里插入图片描述
题意:有一个构造的函数在这里插入图片描述
给出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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值