description構造m×你有乙個長度為n的數字串。定義f(s)為將s拆分成若干個1~m的數的和的方案數,比如m=2時,f(4)=5,分別為4=1+
1+1+1你可以將這個數字串分割成若干個數字(允許前導0),將他們加起來,求f,並求和。比如g(123)=f(1+2+3)
+f(1+23)+f(12+3)+f(123)。已知字串和m後求答案對998244353(7×17×223+1,乙個質數)取模後的值。 input
第一行輸入乙個字串,第二行輸入m output
僅輸出乙個數表示答案
m 的轉移矩陣
a 滿足ai
,j=1
當且僅當j=
1 或i+
1=j 。可以發現,fn
=an1
,1。
接下來考慮在字串上dp,但是發現如果直接做不滿足乘法分配律,也就是不能寫成dp
i=∑i
−1j=
0dpj
∗fj+
1..i
。但是因為
f 可以寫成矩陣的冪的形式,這樣就可以提取公因式,滿足了分配律。
在算一段區間的時候,可以預處理出來x∗
10y的答案,然後直接相乘,注意不要寫成o(
n3) 。
#include
#include
#include
using
namespace
std;
#define ll long long
const
int mod=998244353;
int m,n;
char s[510];
struct mat
void i()
mat operator + (const mat &mm) const
mat operator * (const mat &mm) const
return ret;
}mat pow(int x)
return ret;
}}f[10][510],dp[510],t;
mat cal(int l,int r)
int main()
}printf("%d\n",dp[n].a[1][1]);
}
bzoj4033 HAOI2015 樹上染色
題目鏈結 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。第一行兩個整數n,k。接下來n 1行每行三個正整數fr,to...
bzoj4033 HAOI2015 樹上染色
有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入保證所有點之間是聯通的。n 2000,0 k n 來自 臥槽原來我...
BZOJ4033 HAOI2015 樹上染色
bzoj4033 haoi2015 樹上染色 試題描述 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...