牛客竞赛 -被3整除的子序列

题目描述

给你一个长度为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;
}
posted @ 2019-11-04 21:35  白木偶君  阅读(130)  评论(0编辑  收藏  举报