链接:https://ac.nowcoder.com/acm/problem/21302
来源:牛客网

题目描述

给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模

输入描述:

输入一个字符串,由数字构成,长度小于等于50

输出描述:

输出一个整数
示例1

输入

复制
132

输出

复制
3
示例2

输入

复制
9

输出

复制
1
示例3

输入

复制
333

输出

复制
7
示例4

输入

复制
123456

输出

复制
23
示例5

输入

复制
00

输出

复制
3

备注:

n为长度
子任务1: n <= 5
子任务2: n <= 20
子任务3: 无限制

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>

using namespace std;

const int mas=1e9+7;
int dp[55][3],v[55];

int main()
{
    char x=getchar();int cnt=0;
    while(x!='\n')
    {
        v[++cnt]=x-'0';
        x=getchar();
    }

    for(int i=1;i<=cnt;i++)
    {
        if(v[i]%3==0)
        {
            dp[i][0]=(2*dp[i-1][0]+1)%mas;
            dp[i][1]=(2*dp[i-1][1])%mas;
            dp[i][2]=(2*dp[i-1][2])%mas;
        }
        if(v[i]%3==1)
        {
            dp[i][0]=(dp[i-1][0]+dp[i-1][2])%mas;
            dp[i][1]=(dp[i-1][1]+dp[i-1][0]+1)%mas;
            dp[i][2]=(dp[i-1][2]+dp[i-1][1])%mas;
        }
        if(v[i]%3==2)
        {
            dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mas;
            dp[i][1]=(dp[i-1][1]+dp[i-1][2])%mas;
            dp[i][2]=(dp[i-1][2]+dp[i-1][0]+1)%mas;
        }
    }
    cout<<dp[cnt][0]<<endl;
    return 0;
} 
 

 

posted on 2022-07-17 17:34  浅唱\,,笑竹神易  阅读(16)  评论(0)    收藏  举报