1. 程式人生 > 其它 >Codeforces Round #752 (Div. 2)

Codeforces Round #752 (Div. 2)

Codeforces Round #752 (Div. 2)

A Era

題目

給一個長度為 \(n\) 的序列 \(a_1,a_2,\dots,a_n\),每次可以往序列中插入任意個整數,求最少插入多少個整數時 \(\forall i,a_i\le i\)

程式碼

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int read() {
    int re = 0;
    char c = getchar();
    bool negt = false;
    while(c < '0' || c > '9')
        negt |= (c == '-') , c = getchar();
    while(c >= '0' && c <= '9')
        re = (re << 1) + (re << 3) + c - '0' , c = getchar();
    return negt ? -re : re;
}
const int N = 110;
int n;
int a[N];
void solve() {
    n = read();
    for(int i = 1 ; i <= n ; i++)
        a[i] = read();
    int ans = 0;
    for(int i = 1 ; i <= n ; i++)
        ans = max(ans , a[i] - i);
    cout << ans << endl;
}
int main() {
    int T = read();
    while(T--)solve();
}

B XOR Specia-LIS-t

題目

給定正整數序列\(a_1,a_2,\ldots ,a_n\)將其劃分為若干個連續子串,問是否存在一種方案,使得所有字串的最長上升子序列長度 的異或和為0.

思路

如果\(n\)是偶數,我們讓一個數成為一個字串,異或和為0.

如果\(n\)是奇數,我們考慮找一個\(i\),使得\(a_i>a_{i+1}\),將\(i\)\(i+1\)劃分為一個字串,異或和也為0.

程式碼

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int read() {
    int re = 0;
    char c = getchar();
    bool negt = false;
    while(c < '0' || c > '9')
        negt |= (c == '-') , c = getchar();
    while(c >= '0' && c <= '9')
        re = (re << 1) + (re << 3) + c - '0' , c = getchar();
    return negt ? -re : re;
}
const int N = 1e5 + 10;
int n;
int a[N];
void solve() {
    n = read();
    for(int i = 1 ; i <= n ; i++)
        a[i] = read();
    bool flag = false;
    for(int i = 2 ; i <= n ; i++)
        if(a[i] <= a[i - 1]) {
            flag = true;
            break;
        }
    if(flag || (n & 1) == 0)
        puts("YES");
    else
        puts("NO");
}
int main() {
    int T = read();
    while(T--)solve();
}

C Di-visible Confusion

題目

給一個長度為 \(n\) 的序列 \(a_1,a_2,\dots,a_n\),對於每個位置 \(i\),如果 \(a_i\%\left(i+1\right)\not=0\),就可以將 \(a_i\) 刪掉。刪掉之後,後面的數都會往前面移動一位。問能否將序列刪成空。

思路

前面的刪掉會影響後面,後面刪掉不會影響前面.

對於一個\(a_i\),我們假設\(a_1\sim a_{i-1}\)都可以被刪掉,我們考慮找一個位置\(j\in[1,i]\),將\(a_i\)移動到\(j\)位置.如果存在一個\(j\),使得\((j+1)\nmid a_i\)

.就可以將\(a_i\)消掉.

換句話說,如果\(1,2,3,\ldots,j\)都是\(a_i\)的約數,\(a_i\)就不能被消掉,即\(\operatorname{lcm}(2,3\ldots,i+1)\mid a_i\)時,\(a_i\)不能被消掉,序列不能刪空.

程式碼

#include <iostream>
#include <cstdio>
#include <cstring>

#define int long long
using namespace std;
int read() {
    int re = 0;
    char c = getchar();
    bool negt = false;
    while(c < '0' || c > '9')
        negt |= (c == '-') , c = getchar();
    while(c >= '0' && c <= '9')
        re = (re << 1) + (re << 3) + c - '0' , c = getchar();
    return negt ? -re : re;
}

int gcd(int a , int b) {
    return b == 0 ? a : gcd(b , a % b);
}
const int N = 1e5 + 10;
int n;
int a[N];
void solve() {
    n = read();
    for(int i = 1 ; i <= n ; i++)
        a[i] = read();
    int lcm = 1;
    for(int i = 1 ; i <= n ; i++) {
        lcm = lcm / gcd(lcm , i + 1) * (i + 1);
        if(lcm > 1e9)break;
        if(a[i] % lcm == 0) {
            puts("NO");
            return ;
        }
    }
    puts("YES");
}
signed main() {
    int T = read();
    while(T--)solve();
}

D Moderate Modular Mode

題目

給定兩個偶數\(x,y\).

求一個\(n\in[1,2\times10^{18}]\)滿足\(n \bmod x=y\bmod n\).

保證有解.

思路

先考慮簡單的情況:

  1. \(x=y\),顯然\(n=x=y\)是一個答案.
  2. \(x > y\),我們讓\(n>y\),則有\(y\bmod n=y\),在讓\(n\bmod x=y\)即可,\(n=x+y\)是一個答案.
  3. \(x <y\),我們還有\(x,y\)是偶數的條件沒用上呢,然後我也不會了,傳送門.

程式碼

#include <iostream>
#include <cstdio>
#include <cstring>

#define int long long
using namespace std;
int read() {
    int re = 0;
    char c = getchar();
    bool negt = false;
    while(c < '0' || c > '9')
        negt |= (c == '-') , c = getchar();
    while(c >= '0' && c <= '9')
        re = (re << 1) + (re << 3) + c - '0' , c = getchar();
    return negt ? -re : re;
}

void solve() {
    int x = read() , y = read();
    if(x > y)cout << x + y << endl;
    else if(x == y)cout << x << endl;
    if(x < y)cout << y - y % x / 2 << endl;
}
signed main() {
    int T = read();
    while(T--)solve();
}