給你乙個長度為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...