AtCoder Beginner Contest 228(EF补题)

Posted 佐鼬Jun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 228(EF补题)相关的知识,希望对你有一定的参考价值。

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;


F - Stamp Game.

题意:
给定一个 N × M N×M N×M的矩阵 A i , j A_i,j Ai,j,高桥可以将 h 1 × w 1 h_1×w_1 h1×w1大小内的矩阵涂黑,即将这个区域内的格子涂满黑色,青木可以将 h 2 × w 2 h_2×w_2 h2×w2大小内的矩阵涂白,一开始矩阵内的方格都是白色的,最终高桥的分数就是矩阵内黑色方格的分数总和,高桥相让分数最大化,青木想让他的分数最小化,两人都是最聪明的,问双方涂完色后,高桥可能得到的最高分数是多少。
思路:
高桥的每个对应的矩阵的分数总和就是 s 1 ( i T , j T ) = ∑ i = i T i T + h 1 − 1

以上是关于AtCoder Beginner Contest 228(EF补题)的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242