题面
题目描述
输入
两个非负整数A,B
输出
仅一个正整数,表示答案
样例输入
2 3
样例输出
15
数据范围
提示
题解
这道题有N个结论
第一:A可分解为
P
1
b
1
P
2
b
2
.
.
.
P
n
b
n
P1^{b1}P2^{b2}...Pn^{bn}
P1b1P2b2...Pnbn(分解质因数) 第二:首先,第一点是正确的,其次,
A
B
A^B
AB可表示为
P
1
b
1
∗
B
P
2
b
2
∗
B
.
.
.
P
n
b
n
∗
B
P1^{b1*B}P2^{b2*B}...Pn^{bn*B}
P1b1∗BP2b2∗B...Pnbn∗B。 第三:首先,第二点是正确的,其次,若x的约数和为X,y的约数和为Y,则xy的倍数和为XY 第四:首先,第三点是正确的,其次,若pr为一个质数,易得
p
r
c
pr^c
prc的约数和=
1
+
p
r
1
+
p
r
2
+
.
.
.
+
p
r
c
1+pr^1+pr^2+...+pr^c
1+pr1+pr2+...+prc。 第五:这次没有首先了,第四点中的式子是一个等比数列,等比数列的求和公式为:
S
n
=
a
1
(
q
n
−
1
)
q
−
1
(
q
≠
1
)
S_n=\frac{a_1(q^n-1)}{q-1}(q\neq 1)
Sn=q−1a1(qn−1)(q=1) 其中a1为首项,q为等比数列公比,Sn为等比数列前n项和。
所以就可以很轻松的分解质因数+等比数列求和+乘法逆元/递归求解了!!!
代码
#include<bits/stdc++.h>
using namespace std
;
int i
,j
,k
,l
,o
,num
,ny
[9905];
long long a
[55][2],p
;
long long n
,m
;
void fjzys(long long x
)
{
long long y
=1;
num
=0;
while (y
<sqrt(x
))
{
y
++;
if (x
%y
==0)
{
num
++;
a
[num
][0]=y
;
while (x
%y
==0)
{
a
[num
][1]+=p
;
x
/=y
;
}
}
}
if (x
==1) return;
if (a
[num
][0]==x
)
{
a
[num
][1]=a
[num
][1]+p
;
}
else
{
num
++;
a
[num
][0]=x
%9901;
a
[num
][1]=p
;
}
}
long long ksm(long long w
,long long t
)
{
long long v
=1;
w
%=9901;
while (t
!=0)
{
if (t
%2==1)
{
v
=(v
*w
)%9901;
}
t
>>=1;
w
=(w
*w
)%9901;
}
return v
;
}
int main()
{
freopen("spring.in","r",stdin);
freopen("spring.out","w",stdout);
scanf("%lld %lld",&n
,&m
);
p
=m
;
fjzys(n
);
ny
[0]=0;
for (i
=1;i
<=9901;i
++)
{
ny
[i
]=ksm(i
,9899);
}
long long ans
=1;
for (i
=1;i
<=num
;i
++)
{
ans
=ans
*((ksm(a
[i
][0],a
[i
][1]+1)+9900)%9901)%9901*ny
[(a
[i
][0]+9900)%9901]%9901;
}
printf("%lld",ans
);
}