牛客竞赛 -被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;
}

猜你喜欢

转载自www.cnblogs.com/naruto-mzx/p/11795045.html