题目描述
给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模
输入描述
输出描述
代码实现
| #include<iostream> |
| #include<string> |
| |
| using namespace std; |
| |
| |
| |
| |
| const int MOD = 1e9 + 7; |
| |
| int main() |
| { |
| string s; |
| cin >> s; |
| long long dp[50][3]; |
| dp[0][0] = 0; |
| dp[0][1] = 0; |
| dp[0][2] = 0; |
| dp[0][(s[0] - '0') % 3]++; |
| const int N = s.size(); |
| for (int i = 1; i < N; ++i) |
| { |
| int value = (s[i] - '0') % 3; |
| switch (value) |
| { |
| |
| case 0: |
| dp[i][0] = (dp[i - 1][0] * 2 + 1) % MOD; |
| dp[i][1] = (dp[i - 1][1] * 2) % MOD; |
| dp[i][2] = (dp[i - 1][2] * 2) % MOD; |
| break; |
| case 1: |
| dp[i][0] = (dp[i - 1][0] + dp[i - 1][2]) % MOD; |
| dp[i][1] = (dp[i - 1][1] + dp[i - 1][0] + 1) % MOD; |
| dp[i][2] = (dp[i - 1][2] + dp[i - 1][1]) % MOD; |
| break; |
| case 2: |
| dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % MOD; |
| dp[i][1] = (dp[i - 1][1] + dp[i - 1][2]) % MOD; |
| dp[i][2] = (dp[i - 1][2] + dp[i - 1][0] + 1) % MOD; |
| default: |
| break; |
| } |
| } |
| cout << dp[N - 1][0] << endl; |
| |
| return 0; |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!