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 ap11( 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 P1的商, r r r K N K^N KN除以 P − 1 P-1 P1的余数
2. M M M不是 P P P的倍数
q q q K N K^N KN除以 P − 1 P-1 P1的商, r r r K N K^N KN除以 P − 1 P-1 P1的余数根据上面的结论, 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(P1)+r=Mq(P1)×Mr1q×MrMr(modP)
所以就是先算 K N m o d ( P − 1 ) K^Nmod(P-1) KNmod(P1) 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) M0(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) MP11(modP),所以可以直接在第一次的快速幂中加上 P − 1 P-1 P1
不会影响等式,因为 M K N × M P − 1 ≡ M K N ( m o d P ) M^K^N×M^P-1≡M^K^N(modP) MKN×MP1MKN(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 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242