蓝桥杯-子 2023 / 双子数
题解:
第一个问题A
动态规划问题
f[4]
状态表示:
- f[0]表示数字是2的个数
- f[1]表示以2开头0结尾的个数
- f[2]表示以20开头2结尾的个数
- f[3]表示以202开头3结尾的个数
f[3]就是答案
代码中有详细的注释和注意事项
A代码👇
#include<bits/stdc++.h> #define int long long // 答案会爆 int using namespace std; int f[4]; signed main(){ string s; for(int i=1;i<=2023;i++) s+=to_string(i);//构造string for(int i=0;i<s.size();i++){ if(s[i]=='2') // 状态计算 { f[0]++; f[2]+=f[1]; // 2 既可以是第一个, 也可以是第二个, 是第二个的话, 需要是以20开头, 即f[1] } else if(s[i]=='0') f[1]+=f[0]; else if(s[i]=='3') f[3]+=f[2]; } cout<<f[3]<<endl; }
第二个问题B
- 找出 1 ~ 23333333333333中的所有素数
- 枚举所有素数, 判断是否满足 p * p * q * q == n
- 满足条件的cnt ++
代码中有详细的注释和注意事项
B代码👇
#include <bits/stdc++.h> using namespace std; #define int __int128 // 这里用long long也不行, longlong数据范围是1e18, __int128是1e38 const int N = 1e7 + 10; // 因为23333333333333不到1e14, 对它开方, 它的素数不超过1e7 bool prime[N]; vector<int> v; signed main() { // 筛素数 prime[1] = true; for (int i = 2; i < N; i ++) { if (!prime[i]) { v.push_back(i); for (int j = i + i; j < N; j += i) prime[j] = true; } } // 找满足条件的个数 long long cnt = 0; for (int i = 0; i < v.size(); i ++) for (int j = i + 1; j < v.size(); j ++) { // 不要用注释的判断方法, 运行时间太长, 要跑好久好久久久... // if (v[i] * v[i] * v[j] * v[j] >= 2333 && v[i] * v[i] * v[j] * v[j] <= 23333333333333) if (v[i] * v[i] * v[j] * v[j] < 2333) continue; else if (v[i] * v[i] * v[j] * v[j] > 23333333333333) break; cnt ++; } cout << cnt << endl; return 0; }
最终ac代码👇
#include <bits/stdc++.h> using namespace std; signed main() { string str; cin >> str; if (str == "A") cout << 5484660609 << endl; else cout << 947293 << endl; return 0; }
觉得写的不错的话, 点个赞吧~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具