zoukankan      html  css  js  c++  java
  • 被3整除的子序列

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

    题目描述

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

    输入描述:

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

    输出描述:

    输出一个整数
    示例1

    输入

    复制
    132

    输出

    复制
    3
    示例2

    输入

    复制
    9

    输出

    复制
    1

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int mod = 1000000000+7;
    ll dp[60][5];
    
    int main()
    {
        string str;
        cin>>str;
    
        int  n =str.length();
        for(int i=0;i<n;i++)
        {
            dp[i][(str[i]-'0')%3] = 1;
        }
        for(int i=1;i<=n-1;i++)
        {
            if((str[i]-'0')%3 == 0)
            {
                dp[i][0] = 2*dp[i-1][0]+1;
                dp[i][1] = 2*dp[i-1][1];
                dp[i][2] = 2*dp[i-1][2];
            }
            else if((str[i]-'0')%3 == 1)
            {
                dp[i][0] = dp[i-1][0]+dp[i-1][2];
                dp[i][1] = dp[i-1][1]+dp[i-1][0]+1;
                dp[i][2] = dp[i-1][2]+dp[i-1][1];
            }
            else{
                dp[i][0] = dp[i-1][0]+dp[i-1][1];
                dp[i][1] = dp[i-1][1]+dp[i-1][2];
                dp[i][2] = dp[i-1][2]+dp[i-1][0]+1;
            }
            for(int j=0;j<2;j++)
                dp[i][j] %= mod;
        }
        cout<<dp[n-1][0]<<endl;
        return 0;
    }


  • 相关阅读:
    bzoj1098 1301
    bzoj3237
    bzoj3170
    bzoj4008
    一些题解
    bzoj4028
    bzoj3196
    redis学习
    quartz学习
    电商618 压测、优化、降级预案
  • 原文地址:https://www.cnblogs.com/tonyyy/p/10713307.html
Copyright © 2011-2022 走看看