HAOI2015 bzoj4037 數字串拆分

2021-07-28 12:55:49 字數 1202 閱讀 4302

description

你有乙個長度為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×

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個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...