POJ1845(A^B的约数之和)

对 A进行质因子分解
A = P 1 k 1 ⋅ P 2 k 2 ⋯ ⋅ P n k n A=P_1^{k_1}\cdot P_2^{k_2} \cdots \cdot P_n^{k_n} A=P1k1P2k2Pnkn
所以
A B = ( P 1 k 1 ⋅ P 2 k 2 ⋯ ⋅ P n k n ) B = P 1 k 1 B ⋅ P 2 k 2 B ⋯ ⋅ P n k n B A^B=(P_1^{k_1}\cdot P_2^{k_2} \cdots \cdot P_n^{k_n})^B=P_1^{k_1B}\cdot P_2^{k_2B} \cdots \cdot P_n^{k_nB} AB=(P1k1P2k2Pnkn)B=P1k1BP2k2BPnknB
所以约数之和为
a n s w e r = ( 1 + P 1 + P 1 2 + ⋯ + P 1 k 1 ) ⋅ ( 1 + P 2 + P 2 2 + ⋯ + P 2 k 2 ) ⋅ ( 1 + P n + P n 2 + ⋯ + P n k n ) answer=(1+P_1+P_1^2+\cdots+P_1^{k_1})\cdot(1+P_2+P_2^2+\cdots +P_2^{k_2})\cdot (1+P_n+P_n^2+\cdots+P_n^{k_n}) answer=(1+P1+P12++P1k1)(1+P2+P22++P2k2)(1+Pn+Pn2++Pnkn)
容易想到等比数列的前n项和公式,但这个公式里有要除以 P k − 1 P_k-1 Pk1
那么容易想到用逆元,但质数9901太小了,无法保证互质
所以只能换种办法求等比数列的前 n n n项和;
问题化为怎么求 p p p的前 n n n项和:
当n为奇数时
1 + p + p 2 + p 3 + . . . + p n 1 + p + p^2 + p^3 +...+ p^n 1+p+p2+p3+...+pn
= ( 1 + p n / 2 + 1 + p ⋅ ( 1 + p n / 2 + 1 ) + ⋯ + p n / 2 ⋅ ( 1 + p n / 2 + 1 ) = (1+p^{n/2+1}+ p\cdot(1+p^{n/2+1}) +\cdots+ p^{n/2} \cdot(1+p^{n/2+1}) =(1+pn/2+1+p(1+pn/2+1)++pn/2(1+pn/2+1)
= ( 1 + p + p 2 + . . . + p n / 2 ) ⋅ ( 1 + p n / 2 + 1 ) = (1 + p + p^2 +...+ p^{n/2})\cdot(1 + p^{n/2+1}) =(1+p+p2+...+pn/2)(1+pn/2+1)
当n为偶数时
1 + p + p 2 + p 3 + . . . + p n 1 + p + p^2 + p^3 +...+ p^n 1+p+p2+p3+...+pn
= ( 1 + p n / 2 + 1 + p ⋅ ( 1 + p n / 2 + 1 ) + ⋯ + p n / 2 − 1 ⋅ ( 1 + p n / 2 + 1 ) = (1+p^{n/2+1}+ p\cdot(1+p^{n/2+1}) +\cdots+ p^{n/2-1} \cdot(1+p^{n/2+1}) =(1+pn/2+1+p(1+pn/2+1)++pn/21(1+pn/2+1)
= ( 1 + p + p 2 + . . . + p n / 2 − 1 ) ⋅ ( 1 + p n / 2 + 1 ) + p n / 2 = (1 + p + p^2 +...+ p^{n/2-1})\cdot(1 + p^{n/2+1})+p^{n/2} =(1+p+p2+...+pn/21)(1+pn/2+1)+pn/2
所以递归求即可
代码:

#include<iostream>
#include<cstring>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=4e2+7;
const int mod=9901;
using namespace std;
int p[MX],k[MX];
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcm(ll a,ll b){return a*b/__gcd(a,b);}
ll __get(ll a,ll b)
{
   ll ans=1;
   if(b==0)return 1;
   if(b==1)return a+1;
   if(b&1)
       ans=ans*__get(a,b/2)%mod*(1+qpow(a,b/2+1));
   else {
       ans=ans*__get(a,b/2-1)*(1+qpow(a,b/2+1))%mod+qpow(a,b/2);
       ans%=mod;
   }
   return ans;
}
int main()
{
 ios::sync_with_stdio(0),cin.tie(0);
 ll a,b;
 while(cin>>a>>b){
 memset(k,0,sizeof k);
 int top=0;
 for(int i=2;i*i<=a;i++)
 {
     if(a%i==0)
     {
         p[++top]=i;
         while(a%i==0)
         {
             a/=i;
             k[top]++;
         }
     }
 }
 if(a>1){
   p[++top]=a;
   k[top]=1;
 }
 ll ans=1;
 rep(i,1,top) ans=ans*__get(p[i],b*k[i])%mod;
 cout<<ans<<endl;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值