G. 美好的一天早早结束

题意分析

给出一个加密后的字符串,要求将其按照题干中提取出的变换规则解密出原始字符串。

题解

现代密码学,两个在 的数字,可以考虑一下仿射密码。由于密钥空间很小,可以直接暴力算出符合要求的密钥对,然后不难发现有一对 满足和日期有关的需求,即可解出本题。

受限于密钥的要求,诸如 或者 这些都不行,只能退而求其次了。

代码

int G(int a, int b, int& x, int& y){
	if(!b){
		x = 1, y = 0;
		return a;
	}
	int g = G(b, a % b, y, x);
	y -= (a / b) * x;
	return g;
}

int M(int a, int b){ // ExGCD求逆
    int x, y;
    G(a, b, x, y);
    return (x + b) % b;
}

char decryptChar(char c, int a, int b, int k){
    int D = islower(c) ? 'a' : 'A';
    c -= D;
    return ((M(a, k) * (c - b + k)) % k) + D;
}

int main(){
    string s;
    cin >> s;
    for(auto c : s) cout << decryptChar(c, 21, 4, k);
    return false;
}

H. 从摸鱼开始的奶茶店生活

题意分析

下一个在周日的情人节是几几年。

题解

今天星期五,后天星期日,小学数学题,直接得出今年+2=2027年

代码

2027

I. 程序设计入门

题意分析

给定 和一个数列 , 问能否进行不多于 次操作:交换两个数字;使两个数字同时变为一个比二者都小的数字,使数列 同时满足以下两个条件:

题解

由于 的数据范围,不难看出不管怎么操作都能满足条件2,让 满足不下降序列。

但是 的时候,无法找到两个 使满足条件1,故 的时候为No,其余时刻均为Yes。

代码

void solve(){
    int n, k, x; cin >> n >> k;
    for(int i = 0; i < n; ++i) cin >> x;
    if(n == 1) cout << "NO" << endl; else cout << "YES" << endl;
    return;
}