Loj 10211 sumdiv

題目描述

求 A^B 的全部約數之和 mo9901。html

首先,咱們要求出A的約數之和。ios

就是把A分解質因數,成爲:a1^k1*a2^k2*a3^k2....git

而後約數和就是(a1^0+a1^1+a1^2+....)*(a2^0+a2^1+....)*.......ide

那麼A的B次方就是每一位都乘以一個Bui

而後對於每個ai,都是一個等比數列求和。spa

而後求和公式須要用到除法,須要逆元。code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <queue>
#define in(a) a=read()
#define MAXN 100010
#define REP(i,k,n)  for(long long i=k;i<=n;i++)
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')
            f=-1;
    for(;isdigit(ch);ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
long long pr[100010],ti[10010];
long long ind=0;
long long mod=9901;
inline void divide(long long n){
    for(long long i=2;i*i<=n;i++)
        if(n%i==0){
            pr[++ind]=i;
            while(n%i==0){
                n=n/i;
                ti[ind]++;
            }
        }
    if(n>1){
        pr[++ind]=n;
        ti[ind]=1;
    }
    return ;
}
inline long long qpow(long long a,long long b){
    long long ans=1;
    while(b){
        if(b%2)  ans=(ans*a)%mod;
        b/=2;
        a=(a*a)%mod;
    }
    return ans;
}
int main(){
    long long a,b;
    long long ans=1;
    in(a),in(b);
    divide(a);
    REP(i,1,ind){
        if(pr[i]-1%mod==0)
            ans=ans*(ti[i]*b)%mod;
        long long den,dor;
        den=qpow(pr[i],b*ti[i]+1)-1;
        dor=qpow(pr[i]-1,mod-2);
        ans=(ans*(den*dor)%mod)%mod;
    }
    cout<<ans;
    return 0;
}
相關文章
相關標籤/搜索