POJ 1845 sumdiv (dividir e conquistar, recursão dicotômica, poder rápido, restrições e fórmulas da teoria dos números)

POJ 1845

A ideia de resolver o problema é a seguinte:

Insira a descrição da imagem aqui
ponto importante

  1. Tenha cuidado com várias entradas
  2. Não confie na placa com muita facilidade. Minha recarga rápida de energia estava errada. Sem palavras
  3. Lembre-se de limpar
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;
}

Acho que você gosta

Origin blog.csdn.net/weixin_44986601/article/details/107241514
Recomendado
Clasificación