题目
求ABA^BAB的约数和mod  9901\mod9901mod9901
分析
首先A的约数和是
##∏i=1m∑j=0cipij\prod_{i=1}^m\sum_{j=0}^{c_i}{p_i}^j∏i=1m∑j=0cipij
那么ABA^BAB的约数和为
##∏i=1m∑j=0cipij∗B\prod_{i=1}^m\sum_{j=0}^{c_i}{p_i}^{j*B}∏i=1m∑j=0cipij∗B
那么对于单个的质因数应该怎么做,首先它转换成
##1+p1+p2+p3+...+pB∗c1+p^1+p^2+p^3+...+p^{B*c}1+p1+p2+p3+...+pB∗c
根据等比数列公式可得答案为
##(pB∗c−1)/(p−1)(p^{B*c}-1)/(p-1)(pB∗c−1)/(p−1)
问题是modmodmod无法在除法下进行,所以要用乘法逆元,特别地,当p−1p-1p−1是9901的倍数时,那么答案为B∗c+1B*c+1B∗c+1
代码
#include <cstdio>
using namespace std;
typedef long long ll;
ll a,b,ans=1;
ll ksm(ll x,ll y){//快速幂
ll ans=1;
while (y){
if (y&1) ans=ans*x%9901;
x=x*x%9901; y>>=1;
}
return ans;
}
ll answer(ll x,ll y){
if ((x-1)%9901==0) return (y+1)%9901;//特判
int a=ksm(x,y+1); a=(a+9900)%9901;//分子在0到9900之间
int b=ksm(x-1,9899); return a*b%9901;//乘法逆元
}
int main(){
scanf("%lld%lld",&a,&b);
for (ll i=2;i*i<=a;i++)
if (a%i==0){//质因数分解
ll sum=0;
while (a%i==0) sum++,a/=i;
ans=ans*answer(i,sum*b)%9901;
}
if (a>1) ans=ans*answer(a,b)%9901;//特判
printf("%lld",ans);
return 0;
}
本文介绍了一种高效算法来计算模9901下ABA^BAB的约数和,利用了等比数列的性质,并通过质因数分解和快速幂运算实现。特别讨论了当(p-1)为9901的倍数时的特殊情况。
994

被折叠的 条评论
为什么被折叠?



