2026/4/18 16:34:24
网站建设
项目流程
手把手教你实现电商网站开发,软件工程的八个步骤,学校自己做的网站需要买服务器吗,局域网内建网站CF621E-Wet Shark and Blocks
题目大意
你现在一共有 b b b 堆一模一样的数字#xff0c;每堆数字中有 n n n 个 1 − 9 1-9 1−9 的一位数。你现在可以从每一堆里恰好选一个数#xff0c;将这些数从左到右拼成一个大数。将这个拼成的大数对 x x x 取模#xff0c;问你…CF621E-Wet Shark and Blocks题目大意你现在一共有b bb堆一模一样的数字每堆数字中有n nn个1 − 9 1-91−9的一位数。你现在可以从每一堆里恰好选一个数将这些数从左到右拼成一个大数。将这个拼成的大数对x xx取模问你最后结果是k kk的取法有多少取法数量对1 e 9 7 1e971e97取模。题解可以发现设d p [ m ] [ i ] dp[m][i]dp[m][i]为前m mm堆余数为i ii的种数有如下递推式d p [ m 1 ] [ ( i ∗ 10 v a l ) % x ] d p [ m ] [ i ] dp[m1][(i*10val) \% x]dp[m][i]dp[m1][(i∗10val)%x]dp[m][i]v a l valval为下一堆中取的数字。可以发现递推式只和相邻两堆有关。所以可以简化成d p [ i ] [ ( i ∗ 10 v a l ) % x ] Σ i [ n u m [ i ] v a l ] dp[i][(i*10val) \% x]\Sigma_i [num[i]val]dp[i][(i∗10val)%x]Σi[num[i]val]表示从余数i ii转移到下一堆余数( i ∗ 10 v a l ) % x (i*10val) \% x(i∗10val)%x的种数。接下来就是对这个矩阵进行矩阵快速幂加速得到结果。#includebits/stdc.h#defineiosios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl\nusingnamespacestd;#defineintlonglongconstintmod1e97;structMatrix{intn,m;vectorvectorinta;Matrix(int_n0,int_m0):n(_n),m(_m){a.resize(n,vectorint(m,0));}Matrixoperator*(constMatrixb)const{if(m!b.n)throwMatrix dimension error;Matrixres(n,b.m);for(inti0;in;i){for(intj0;jb.m;j){for(intk0;km;k){res.a[i][j](res.a[i][j]1LL*a[i][k]*b.a[k][j])%mod;}}}returnres;}Matrixpow(longlongk)const{if(n!m)throwMatrix must be square;Matrixres(n,n),base*this;for(inti0;in;i)res.a[i][i]1;while(k0){if(k1)resres*base;basebase*base;k1;}returnres;}};inlinevoidsolve(){intn,b,k,x;cinnbkx;MatrixA(x,x);for(inti0;in;i){intval;cinval;for(intj0;jx;j){intnext(j*10val)%x;A.a[j][next](A.a[j][next]1)%mod;}}Matrix AbA.pow(b);coutAb.a[0][k]endl;}signedmain(){ios;intT1;// cin T;while(T--)solve();return0;}