AtCoder Beginner Contest 228(E补题)
Posted 佐鼬Jun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 228(E补题)相关的知识,希望对你有一定的参考价值。
E - Integer Sequence Fair
题意:
P
=
998244353
P=998244353
P=998244353输入三个数,
M
,
N
,
K
M,N,K
M,N,K 就是需要求
M
k
N
m
o
d
M^k^N mod
MkNmod
P
P
P
思路: 由于数据范围很大 所以需要先处理
K
N
K^N
KN,再处理
M
k
N
M^k^N
MkN
根据费马小定理 如果
g
c
d
(
a
,
p
)
=
1
gcd(a,p)=1
gcd(a,p)=1那么
a
p
−
1
≡
1
a^p-1≡1
ap−1≡1(
m
o
d
p
mod p
modp)
在这个题中,由于
P
P
P是素数,所以除了
M
M
M是
P
P
P的倍数以外的情况, 一定会出现
g
c
d
(
P
,
M
)
=
1
gcd(P,M)=1
gcd(P,M)=1
所以分类讨论即可
1.
M
M
M是
P
P
P的倍数,那么
M
m
o
d
P
=
0
MmodP=0
MmodP=0所以输出0即可
令
q
q
q为
K
N
K^N
KN除以
P
−
1
P-1
P−1的商,
r
r
r为
K
N
K^N
KN除以
P
−
1
P-1
P−1的余数
2.
M
M
M不是
P
P
P的倍数
令
q
q
q为
K
N
K^N
KN除以
P
−
1
P-1
P−1的商,
r
r
r为
K
N
K^N
KN除以
P
−
1
P-1
P−1的余数根据上面的结论,
M
K
N
M^K^N
MKN
=
M
q
(
P
−
1
)
+
r
=
M
q
(
P
−
1
)
×
M
r
≡
1
q
×
M
r
≡
M
r
(
m
o
d
P
)
=M^q(P-1)+r=M^q(P-1)×M^r≡1^q×M^r≡M^r(modP)
=Mq(P−1)+r=Mq(P−1)×Mr≡1q×Mr≡Mr(modP)
所以就是先算
K
N
m
o
d
(
P
−
1
)
K^Nmod(P-1)
KNmod(P−1)为
t
e
m
p
temp
temp,再算
M
t
e
m
p
(
m
o
d
P
)
M^temp(modP)
Mtemp(modP)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int MOD = 998244353;
int phi(ll x)
ll res = x;
for (ll i = 2; i <= x / i; i++)
if (x % i == 0)
res = res / i * (i - 1);
while (x % i == 0)
x /= i;
if (x > 1) res = res / x * (x - 1);
return res;
int qmi(int a, int k, int mod)
int res = 1;
a %= mod;
while (k)
if (k & 1) res = res * a % mod;
a = a * a % mod;
k >>= 1;
return res;
signed main()
int n, k, m;
cin >> n >> k >> m;
ll p = phi(MOD);
if (m % MOD == 0)
cout << 0 << endl;
return 0;
int temp = qmi(k, n, p);
int res = qmi(m, temp, MOD);
cout << res << endl;
在快速幂中之所以要特判
M
≡
0
(
m
o
d
p
)
M≡0(modp)
M≡0(modp)的情况,是因为如果出现指数变成
0
0
0,那么写的快速幂由于没有特判就会直接输出
1
1
1,但是本应该输出
0
0
0
但是也可以不特判,因为只要保证指数
>
0
>0
>0即可,因为通过前提推论可知,
M
P
−
1
≡
1
(
m
o
d
P
)
M^P-1≡1(modP)
MP−1≡1(modP),所以可以直接在第一次的快速幂中加上
P
−
1
P-1
P−1
不会影响等式,因为
M
K
N
×
M
P
−
1
≡
M
K
N
(
m
o
d
P
)
M^K^N×M^P-1≡M^K^N(modP)
MKN×MP−1≡MKN(modP)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int MOD = 998244353;
int phi(ll x)
ll res = x;
for (ll i = 2; i <= x / i; i++)
if (x % i == 0)
res = res / i * (i - 1);
while (x % i == 0)
x /= i;
if (x > 1) res = res / x * (x - 1);
return res;
int qmi(int a, int k, int mod)
int res = 1;
a %= mod;
while (k)
if (k & 1) res = res * a % mod;
a = a * a % mod;
k >>= 1;
return res;
signed main()
int n, k, m;
cin >> n >> k >> m;
ll p = phi(MOD);
int temp = qmi(k, n, p) + p;
int res = qmi(m, temp, MOD);
cout << res << endl;
To be continued
如果你有任何建议或者批评和补充,请留言指出,不胜感激
以上是关于AtCoder Beginner Contest 228(E补题)的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解