CUC-ACM Autumn Training Round #4 位运算

一场比赛只过了三道题

BDG三道无脑水题,还要一道2^63快速幂套快速乘的板子题E也没看出来

点击查看代码
long long  mul(long long a, long long b, long long m) {
	long long ans = 0;
	a %= m;
	while (b > 0) {
		if (b & 1) {
			ans += a;
			if (ans > m)
				ans -= m;
		}
		a <<= 1;
		if (a >= m)
			a -= m;
		b >>= 1;
	}
	return ans;
}

long long pow(long long a, long long b, long long m) {
	long long ans = 1;
	while (b > 0) {
		if (b & 1) {
			ans = mul(ans, a, m);
		}
		a = mul (a, a, m);
		b >>= 1;
	}
	return ans;
}

A题和H题b题难度,就还是模拟,但是最近思维题做多了,就没敢下手写,一直在找规律,但是其实数据范围足够小,可以直接常规思路过,不需要做其他操作。
H题中涉及的二进制到十进制我有点没反应过来,差点用三层循环,还有那个sum<=()...

点击查看代码

int main() {
	int t;
	cin >> t;
	getchar();
	while (t--) {
		cin >> s;
		int len = s.length();
		int cnt = 0;
		int zero = 0;
		for (int i = 0; i < len; i++) {
			if (s[i] == '1') {
				int sum = 0;
				for (int j = i; j < len ; j++) {
					sum = sum * 2 + (s[j] - '0');
					if (sum <= j - i + 1 + zero) {//这个地方
						cnt++;
					} else
						break;
				}
				zero = 0;
			} else
				zero++;
		}
		cout << cnt << endl;
	}
	return 0;
}

C题也是板子题,是师姐课上讲的关于求集合的所有子集的板子,but我陷入了如何存下集合的难题,就没继续写这道题,智慧的人一定一眼就看出来了,但是看错题的人,比如我,误把题目看成按顺序找集合中的数……注意取余的时候要从大到小取。
F题也很水,就主要是里面直接搜两次会TLE,直接存起来会更加方便,然后用乘法,记得删去重复的。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
long long f[5];

int main() {
	int n;
	long long ans = 0;
	scanf("%d", &n);
	string s1, s2;
	cin >> s1 >> s2;
	for (int i = 0; i < n; i++) {
		if (s1[i] == '0') {
			if (s2[i] == '0')
				f[1]++; //00
			else
				f[2]++; //01
		} else {
			if (s2[i] == '0')
				f[3]++;//10
			else
				f[4]++;//11
		}
	}//10*00 10*01 11*00
	ans = f[1] * f[3] + f[1] * f[4] + f[2] * f[3];
	printf("%lld\n", ans);
	return 0;
}

希望以后还是得多看看榜,从易到难,因为多交不罚时,所以还是可以多交交题的。

posted @ 2021-11-16 20:58  oddpointa  阅读(105)  评论(0)    收藏  举报