以下为个人场上所提交答案,欢迎大家指出错误,后续会更正正确题解。

个人提交:25

说明: Mbps是M bit per second, MB是 M Byte,bit是比特,Byte是字节,1Byte=8bit, 200/8=25

个人提交:21844 (有误)
改正:1903

说明:只有每个位都为1、3、5、7之一才是题目所说的纯质数。还有一个条件当时没注意到,这个数本身也要是素数,应该先用埃氏筛法。

代码:
#include<cstdio> #include<cstring> const int MAX_N = 20210605; int num[MAX_N +
1]; int sum = 0; void solve(int x) { int isPrime = 1; while(x > 0) { int b = x%
10; //b为x的个位数字 if(!(b == 2 || b == 3 || b == 5 || b == 7)) { isPrime = 0; break;
} x = x/10; } if(isPrime) sum++; } int main() { memset(num, 1, sizeof(num)); for
(int i = 2; i < 20210605; i++) { for(int j = 2; i*j <= 20210605; j++) { num[i*j]
= 0; } } for(int i = 1; i <= 20210605; i++) { if(num[i]) solve(i); } printf(
"%d\n", sum); return 0; }

个人提交:977

说明:现场写日期类太麻烦,直接用excel搞数据,然后用c处理

先在excel中敲入这两格内容,第三格做个差,看看一共有多少天

得7699,从A1格往下拉7669行,得到从2001/1/1到2021/12/31的每一天
为了方便处理数据,把刚才不用的删掉,并且把表格另存为.csv文件

数据有了,直接全选复制,接下来用c/c++处理
#include<cstdio> #include<iostream> #include<string> using namespace std; int
res= 0; void solve(int x) { for(int i = 0; i < 100; i++) { if(i * i == x) res++;
} } int main() { string line; while(getline(cin, line)) { int len = line.length(
); int sum = 0; for(int i = 0; i < len; i++) { if(isdigit(line[i])) sum += line[
i] - '0'; } solve(sum); cout << res << endl; } }
得出结果977

个人提交:2667336761

说明:不会dp,赌了一把完全二叉树
#include<iostream> using namespace std; const int MAX_N = 2021;
//结点个数,用完全二叉树的编号代表结点 long long C(long long x) { if(x > MAX_N) return 0; return 1
+ C(2*x) + C(2*x+1); } long long W(long long x) { if(x > MAX_N) return 0; return
1 + 2*W(2*x) + 3*W(2*x+1) + C(2*x)*C(2*x)*C(2*x+1); } int main() { cout << W(1)
<< endl; return 0; }

代码:
#include<cstdio> #include<cstring> #include<ctype.h> char s[110]; int main() {
scanf("%s", s); for(int i = 0; i < strlen(s); i++) printf("%c", toupper(s[i]));
return 0; }

常规写法,过40%用例,评论区大佬说二分法,我在考场想到利用等差数列前n项和并根据R-L的值取分段函数,但是没来得及改,后期补上
#include<cstdio> const int MAX_N = 200000000; int a[MAX_N], sum = 0; void solve
() { int maxn = 1, n = 1; for(int i = 1; i < MAX_N; i++) { a[i] = n++; if(n >
maxn) { maxn++; n=1; } } } int main() { solve(); int T; scanf("%d", &T); for(int
i= 0; i < T; i++) { int l, r; sum = 0; scanf("%d%d", &l, &r); for(int i = 0; l+
i<= r; i++) { sum += a[l+i]; } printf("%d\n", sum); } return 0; }

没找到规律,硬写,过40%用例
评论区大佬说找循环节,后期补上
#include<cstdio> #include<cstring> const int MAX_N = 200000000; char s[MAX_N];
char s2[MAX_N]; int n, t; void reverse() { s2[0] = s[0]; for(int i = 1; i < n; i
++) { s2[i] = (s[i] - '0') ^ (s[i-1] - '0') + '0'; } strncpy(s, s2, n); } int
main() { scanf("%d%d", &n, &t); scanf("%s", s); for(int i = 0; i < t; i++)
reverse(); printf("%s", s); return 0; }

不会dp,硬写过30%用例
#include<cstdio> using namespace std; int N, K, res = 0; void solve(int x) {
int sum = 0; while(x > 0) { if(x % 2 == 1) sum++; x = x/2; } if(sum == K) res++;
} int main() { scanf("%d%d", &N, &K); for(int i = 1; i <= N; i++) solve(i);
printf("%d\n", res); return 0; }

简单的括号匹配(栈),不知道能过多少用例
评论区说线段树,后期补上
#include<cstdio> #include<stack> using namespace std; const int MAX_N = 1000000
+10; int n, m, L, R;; char s[MAX_N]; void rev() { for(int i = 0; L+i <= R; i++)
{ if(s[L+i] == '(') s[L+i] = ')'; else s[L+i] = '('; } } int isLawful(int R) {
stack<int> s1; for(int i = 0; L+i <= R; i++) { int ch = s[L+i]; if(ch == '(') s1
.push(ch); else if(!s1.empty() && ch==')' && s1.top() == '(') { s1.pop(); } else
{ s1.push(ch); } } if(s1.empty()) return 1; else return 0; } void solve() { for(
int i = n; i > L; i--) { if(isLawful(i)) { printf("%d\n", i); return; } } printf
("%d\n", 0); } int main() { scanf("%d%d", &n, &m); scanf("%s", s+1); //
使索引和L、R一致 for(int i = 0; i < m; i++) { int k = 0; scanf("%d", &k); if(k == 1) {
scanf("%d%d", &L, &R); rev(); } else { scanf("%d", &L); solve(); } } return 0; }

硬写,勉强过10%用例吧

考场上理解错了耗了一个多小时,还弄了个结构体,放到set里去重,然后运算符重载,最后发现根本不用,哈哈哈,以后还是应该先写个大概,看看样例输入输出,再往下做。

对了,异或运算符 ^ 优先级较低,记得加括号
#include<cstdio> #include<algorithm> using namespace std; int T, n, res = 0;
void solve() { for(int a = 1; a <= n; a++) { for(int b = 1; b <= n; b++) { for(
int c = 1; c <= min(n, a+b-1); c++) { if(a+b<=c || a+c<=b || b+c<=a) continue;
if((a^b^c) == 0) res++; } } } } int main() { scanf("%d", &T); for(int i = 0; i <
T; i++) { scanf("%d", &n); solve(); printf("%d\n", res); } return 0; }
先写到这,我要去准备期末考试了~
考完继续更正

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信