概述
题目大意
给 A , B A,B A,B,求 A B 的 约 数 和 m o d 9901 A^B的约数和mod 9901 AB的约数和mod9901
思路
A
=
p
1
k
1
∗
p
2
k
2
∗
…
∗
p
n
k
n
=
>
A
B
=
p
1
B
k
1
∗
p
2
B
k
2
∗
…
∗
p
n
B
k
n
A=p_1^{k_1}*p_2^{k_2}*…*p_n^{k_n}=>A^B=p_1^{Bk_1}*p_2^{Bk_2}*…*p_n^{Bk_n}
A=p1k1∗p2k2∗…∗pnkn=>AB=p1Bk1∗p2Bk2∗…∗pnBkn
A
B
的
约
数
和
m
o
d
9901
=
∏
i
=
1
n
(
∑
j
=
0
B
k
i
p
i
j
)
m
o
d
9901
=
∏
i
=
1
n
(
p
B
k
i
+
1
−
1
p
i
−
1
)
A^B的约数和mod 9901=prod^n_{i=1}(sum^{Bk_i}_{j=0}p^j_i)mod 9901=prod^n_{i=1}({p^{Bk_i+1}-1over p_i-1})
AB的约数和mod9901=∏i=1n(∑j=0Bkipij)mod9901=∏i=1n(pi−1pBki+1−1)
当
9901
∣
(
p
i
−
1
)
9901|(p_i-1)
9901∣(pi−1)时,
∑
j
=
0
B
k
i
p
i
j
=
B
k
i
+
1
sum^{Bk_i}_{j=0}p^j_i=Bk_i+1
∑j=0Bkipij=Bki+1。
否则,分母快速幂,分子用费马小定理求逆元。
code:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
long long myd=9901,ans=1;
long long ksm(long long x,long long y,long long myd)
{
long long nas=1;
while (y)
{
if (y&1) nas=nas*x%myd;
x=x*x%myd;
y>>=1;
}
return nas;
}
long long invfm(long long x,long long myd)
{
return ksm(x,myd-2,myd);
}
int main()
{
long long A,B,o=2,s;
cin>>A>>B;
while (o*o<=A)
{
if (A%o==0)
{
s=0;
while (A%o==0) s++,A/=o;
if ((o+1)%myd==0) ans=ans*(B*s+1)%myd;
else ans=ans*((ksm(o,s*B+1,myd)-1+myd)%myd)%myd*invfm(o-1,myd)%myd;
}
o++;
}
if (A!=1)
{
if ((A+1)%myd==0) ans=ans*(B+1)%myd;
else ans=ans*((ksm(A,B+1,myd)-1+myd)%myd)*invfm(A-1,myd)%myd;
}
cout<<ans;
return 0;
}
最后
以上就是顺利蚂蚁为你收集整理的《ybtoj高效进阶》第六部分第三章例题2 约数之和的全部内容,希望文章能够帮你解决《ybtoj高效进阶》第六部分第三章例题2 约数之和所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复