UOJ524【美团杯2020】程序解密【puzzles】

整点沙雕乐呵乐呵。

Small

开头是 #include,如果猜下一个是 < 的话对不上自闭了好一会儿,然后发现下一个是空格。

然后可以再写个打表程序,把已知的对应关系写上去替换掉,然后就能猜猜推推搞出来了。

但是中间还有个二元运算符不知道是啥,暴力测测样例就出来了。

Large

开头是 #include...个鬼啊,连相等字符都不一样,自闭了好一会儿

然后从后面看,看上去还是正常的 } },有了换行符就好办了,对比一下等价字符就可以知道哪里是 int main(){#include 了,还可以发现第一行是坑人的 /*...*/ 注释。

然后同样的方法可以猜出主程序部分,因为有些字符只在变量名出现所以猜不出来,但没有关系,可以随便填一个。

结果发现开头是个大表,你只知道 (0,1) 是哪个。一种方法是枚举 (2-9) 的全排列代入验样例,但感觉很麻烦,实际上可以根据样例解异或方程组,出题人很良心所以系数矩阵满秩,可以直接算出整个表。

#include<bits/stdc++.h>
using namespace std;
const int N = 1000, _[]={293309062,96701749,694916487,371591203,450903345,936470975,360036365,596019536,362870120,978299587,72615453,677215478,297218049,296795024,703206614,117310233,243106488,303113802,602459530,151925105,47183452,590812021,886995042,967943647,1040249104,802320701,554202194,839697519,607415572,770010993};
template<typename T>
void rd(T &x){
	int ch = getchar(); x = 0; bool f = false;
	for(;ch < '0' || ch > '9';ch = getchar()) f |= ch == '-';
	for(;ch >= '0' && ch <= '9';ch = getchar()) x = x * 10 + ch - '0';
	if(f) x = -x;
}
int T, n, a[N], res;
int main(){
	rd(T);
	if(T == 1){
		rd(n);
		for(int i = 1;i <= n;++ i) rd(a[i]);
		for(int i = 1;i <= n;++ i)
			for(int j = i+1;j <= n;++ j)
				if(a[i] > a[j]) res += i ^ j;
		printf("%d
", res); 
	} else {
		rd(T);
		while(T --){
			rd(n); res = 0;
			for(int i = 0;i < 30;++ i)
				if(n>>i&1) res ^= _[i];
			printf("%d
", res);
		}
	}
}
原文地址:https://www.cnblogs.com/AThousandMoons/p/14933359.html