牛客練習題21302 被3整除的子串行

2021-09-10 01:16:38 字數 968 閱讀 5817

給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除

答案對1e9+7取模

輸入乙個字串,由數字構成,長度小於等於50
輸出乙個整數
對乙個數字字串取餘有:

123456789 % m =(((1 * 10 + 2) % m * 10 + 3) % m * 10+ 4) % m......

定義dp[pos][0/1][mod],表示第 pos 位取/不取時餘數為 mod 時的子串行個數,mod屬於【0,2】

有如下轉移方程:

(1)不取pos位

dp[pos][0][mod] = dp[pos-1][0][mod] + dp[pos-1][1][mod]

(2)取第pos位:

dp[pos][1][mod] = dp[pos-1][0][k] + dp[pos-1][1][k]

k應該滿足:(k * 10 % 3 + a[pos])% 3 = mod,暴力k的範圍[0,2],滿足條件時就轉移

#include using namespace std;

typedef long long ll;

const int mod = 1e9+7;

ll dp[60][2][3],a[60];

char s[60];

int main()

dp[0][0][0] = 1; //開始時都不選且餘數為0 = 1

for(int i = 1 ; i <= len; ++i)}}

cout<<(dp[len][1][0] + dp[len][0][0] - 1 + mod) % mod; //減去全不選的情況

return 0;

}

牛客網 21302 被3整除的子串行

題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描述 輸出乙個整數 輸入 132931 題意 題目描述 題解 因為是子串行,所以可以不連續,因此需要儲存每個區間上餘數為0,1,2的數目 用...

牛客網 被3整除

小q得到乙個神奇的數列 1,12,123,12345678910,1234567891011 並且小q對於能否被3整除這個性質很感興趣。小q現在希望你能幫他計算一下從數列的第l個到第r個 包含端點 有多少個數可以被3整除。import sys while true x y sys.stdin.rea...

牛客網練習題整理(3)

1 關於指標的const 用法 class a void f const a p 在vs 2017上沒有任何形式的引數傳進來 void g const a const p void k const a p int main const a p const a const p const a cons...