题目描述
思路分析
分解质因数+快速幂+推公式
sum(p, k)表示
p
0
+
p
1
+
…
+
p
k
−
1
p^0+p^1+…+p^{k-1}
p0+p1+…+pk−1
然后对
k
k
k的奇偶分情况讨论。
当
k
k
k为偶数时,原式可化为
s
u
m
(
p
,
k
/
2
)
+
p
k
/
2
∗
s
u
m
(
p
,
k
/
2
)
sum(p,k/2)+p^{k/2}∗sum(p,k/2)
sum(p,k/2)+pk/2∗sum(p,k/2)
,也即
(
p
k
/
2
+
1
)
∗
s
u
m
(
p
,
k
/
2
)
(p^{k/2}+1)∗sum(p,k/2)
(pk/2+1)∗sum(p,k/2);
当
k
k
k为奇数时,可以把最后一项拿掉,转化为偶数和+最后一项,最终化简为
s
u
m
(
p
,
k
−
1
)
+
p
k
−
1
sum(p,k−1)+p^{k−1}
sum(p,k−1)+pk−1
代码实现
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int mod=9901;
unordered_map<int,int> primes;
void divide(int n){ //分解质因数
for(int i=2;i<=n/i;i++){
if(n%i==0){
while(n%i==0) primes[i]++,n/=i;
}
}
if(n>1) primes[n]++;
}
int qmi(int a,int b){ //快速幂
int res=1;
while(b){
if(b&1) res=(ll)res*a%mod;
a=(ll)a*a%mod;
b>>=1;
}
return res;
}
int sum(int p,int k){ //推公式
if(k==1) return 1;
if(k%2==0) return (ll)(qmi(p,k/2)+1)*sum(p,k/2)%mod;
else return (qmi(p,k-1)+sum(p,k-1))%mod;
}
int main(){
int a,b;
cin>>a>>b;
divide(a);
int res=1;
for(auto& p:primes){
res=(ll)res*sum(p.first,p.second*b+1)%mod;
}
if(!a) res=0;
printf("%d\n",res);
return 0;
}