HAOI2015 數字串拆分

2022-08-13 15:24:13 字數 1073 閱讀 9961

你有乙個長度為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(717223+1,乙個質數)取模後的值。

第一行輸入乙個字串,第二行輸入m

僅輸出乙個數表示答案

123

3

對於100%的資料,字串長度不超過500,m<=5

矩乘(這題似乎叫什麼十進位制快速冪)

首先\(f\)陣列很好求,\(f[i]=\sum_^\)

然後我們可以很簡單的寫出轉移矩陣(以m=3為例)

$\begin

1 & 1 & 0 \

1 & 0 & 1 \

1 & 0 & 0

\end $

然後我們可以快速處理出\(num[i][j].f\)表示矩陣轉移\(i * 10^j\)次後的答案

這樣我們再考慮對原字串做dp

可以發現乙個問題

這個狀態不好設

我一開始想當然的設的是\(g[i]\)表示到第i位的方案數

然後\(g[i] = \sum_^^

void start()

friend matrix operator * (matrix a , matrix b)

friend matrix operator + (matrix a , matrix b)

} num[w][m] , g[m] , val[m][m] ;

matrix fpw(matrix base , int k)

return temp ;

}void presolve()

}# undef int

int main()

}printf("%lld\n",g[n].f[1][1]) ;

return 0 ;

}

HAOI2015 數字串拆分 矩陣乘法

4037 haoi2015 數字串拆分 time limit 10 sec memory limit 256 mb description 你有乙個長度為n的數字串。定義f s 為將s拆分成若干個1 m的數的和的方案數,比如m 2時,f 4 5,分別為4 1 1 1 1你可以將這個數字串分割成若干個...

4037 HAOI2015 數字串拆分

time limit 10 sec memory limit 256 mb submit 255 solved 156 submit status discuss 你有乙個長度為n的數字串。定義f s 為將s拆分成若干個1 m的數的和的方案數,比如m 2時,f 4 5,分別為4 1 1 1 1你可以...

HAOI2015 bzoj4037 數字串拆分

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...