被3整除的子序列 dp
注意:子序列可以不连续
/*
设dp[0],dp[1],dp[2],表示除3得到的余数分别为0,1,2。每增加一个数就更新一遍数组。
余数为0:dp[0]=dp[0]+dp[0]+1;
dp[1]=dp[1]+dp[1];
dp[2]=dp[2]+dp[2];
余数为1:dp[0]=dp[0]+dp[2];
dp[1]=dp[1]+dp[0]+1;
dp[2]=dp[2]+dp[1];
余数为2:dp[0]=dp[0]+dp[1];
dp[1]=dp[1]+dp[2];
dp[2]=dp[2]+dp[0]+1;
*/
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int main()
{
int dp[55][4];//dp[i][j]表示到字符串的第i个位置为止,
//子序列%3余数为j的个数
memset(dp,0,sizeof(dp));
char s[55];
scanf("%s",s+1);
int n = strlen(s+1);
dp[1][(s[1]-'0')%3] = 1;
for(int i=2;i<=n;i++)
{
int m = (s[i]-'0')%3;
dp[i][m] +=1;
dp[i][m]%=mod;
for(int j=0;j<3;j++)
{
dp[i][j] +=(dp[i-1][j] + dp[i-1][(j+3-m)%3])%mod;//j+3-m由(x+m)%3=j解来
}
}
cout<<dp[n][0]<<endl;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战