随笔 - 34,  文章 - 63,  评论 - 0,  阅读 - 3987
链接: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   浅唱\,,笑竹神易  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示