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;
}
希望以后还是得多看看榜,从易到难,因为多交不罚时,所以还是可以多交交题的。

浙公网安备 33010602011771号