被3整除的子序列
链接:https://ac.nowcoder.com/acm/problem/21302
来源:牛客网
题目描述
给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模
答案对1e9+7取模
输入描述:
输入一个字符串,由数字构成,长度小于等于50
输出描述:
输出一个整数
示例1
输入
132
输出
3
简单说下题意,给定一个数字串,问有多少的子串可以被3整除。
首先一个数如果可以被3整除,那么这个数各位和一定可以被3整除。所以这个题应该是线性dp,我们定义dp[i][j]为前i个中整除3余数为j(只有0,1,2三个数)的个数,然后从头到尾线性dp一遍就可以了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int MMAX=55; const ll mod=1e9+7; int dp[MMAX][3]; char s[55]; int main() { scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++) { int te=(s[i]-'0')%3; dp[i][0]=(dp[i-1][0]+dp[i-1][(3-te)%3])%mod; dp[i][1]=(dp[i-1][1]+dp[i-1][(4-te)%3])%mod; dp[i][2]=(dp[i-1][2]+dp[i-1][(5-te)%3])%mod; dp[i][te]++; // printf("%d %d %d\n",dp[i][0],dp[i][1],dp[i][2]); } printf("%d\n",dp[len][0]); return 0; }