被3整除的子序列

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

题目描述

给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对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;
}

 

posted @ 2020-10-08 21:19  小垃圾的日常  阅读(202)  评论(0)    收藏  举报