你有乙個長度為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對於100%的資料,字串長度不超過500,m<=5 矩乘(這題似乎叫什麼十進位制快速冪)3
首先\(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...