牛客周賽 Round 1

udiandianis發表於2024-06-02

D 遊遊的9的倍數

題目描述

遊遊拿到了一個數字串,她想取一個該數字串的子序列(子序列在原串中可以不連續),使得該子序列是9的倍數。子序列可以包含前導零。
遊遊想知道,一共能取多少個合法的子序列?答案請對 \(10^9+7\) 取模。
我們定義,若兩個子序列在原串中的位置不同,則認為它們不同。

輸入描述

一個長度不超過200000的,僅由'0'~'9' 十種字元組成的字串。

輸出描述

子序列是9的倍數的數量。答案請對 \(10^9+7\) 取模。

程式碼實現

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
const int MOD=1e9+7;
int dp[N][10];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    cin>>s;
    int n=s.size();
    dp[0][0]=1;
    for(int i=0;i<n;i++){
        //不選這個數字
        for(int j=0;j<9;j++){
            dp[i+1][j]=dp[i][j];
        }
        //選這個數字
        for(int j=0;j<9;j++){
            int l=(j+s[i]-'0')%9;
            dp[i+1][l]+=dp[i][j]; 
            dp[i+1][l]%=MOD;
        }
    }
    cout<<dp[n][0]-1<<"\n";
}

相關文章