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";
}