题目描述
给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模
输入描述:
输入一个字符串,由数字构成,长度小于等于50
输出描述:
输出一个整数
dp[i][k]前i个数,凑出余数为k的方案
两种选择,一种从前面凑得转移过来,一种什么不做直接加上前面的方案
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=60;
int n,a[N],dp[N][3],mod=1e9+7;
signed main(){
char c;
while(1){c=getchar();if(c=='\n')break;a[++n]=c-'0';a[n]%=3;}
for(int i=1;i<=n;i++){
for(int k=0;k<3;k++)
dp[i][k]=(dp[i][k]+dp[i-1][(k-a[i]+3)%3])%mod;
for(int k=0;k<3;k++)
dp[i][k]=(dp[i][k]+dp[i-1][k])%mod;
dp[i][a[i]]++;
}
cout<<dp[n][0]%mod;
}