POJ 1845 sumdiv (diviser et conquérir, récursion dichotomique, puissance rapide, contraintes et formules de la théorie des nombres)

POJ 1845

L'idée de résoudre le problème est la suivante:

Insérez la description de l'image ici
point important

  1. Soyez prudent avec plusieurs entrées
  2. Ne faites pas confiance au conseil d'administration trop facilement. Ma recharge rapide était incorrecte. Muet
  3. N'oubliez pas d'effacer
LL p[maxn],k[maxn],modd=9901;
LL sum(LL p,LL k){
    
    
    if(k==0)return 1;
    if(k%2){
    
    
        return (sum(p,k/2)*(1+qpow(p,k/2+1)))%modd;
    }else return (sum(p,k/2-1)*(1+qpow(p,k/2+1))+qpow(p,k/2))%modd;
}
LL solve(LL a,LL b){
    
    
    LL co=0,ans=1;
    for(LL i=2;i*i<=a;i++){
    
    
        if(a%i==0){
    
    
            p[++co]=i;
            k[co]=0;
            while(a%i==0){
    
    
                a/=i;
                k[co]++;
            }
        }
    }
    if(a!=1){
    
    
        p[++co]=a;
        k[co]=1;
    }
    for(int i=1;i<=co;i++){
    
    
        ans=(ans*sum(p[i],b*k[i])%modd)%modd;
    }
    return ans;
}
int main(){
    
    
    LL a,b,co=0,tt;
    while(scanf("%lld%lld",&a,&b)!=EOF){
    
    
        printf("%lld\n",solve(a,b));
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44986601/article/details/107241514
conseillé
Classement