Codeforces 621E dp 矩陣快速冪

2021-08-21 17:45:44 字數 1656 閱讀 6327

題意有 b

b

組數,每組都有相同的

n' role="presentation">n

n個數,現要從每組數中選擇乙個數,聯起來構成乙個大數,使其對

x x

取膜後的值為

k' role="presentation">k

k,問有多少種方案?最終答案對 109

+7109+

7取膜

題解d

p[i]

[j] dp[

i][j

]: 第

i i

組數對

x' role="presentation">x

x取膜後的值為

j j

的方案數 nu

m[a]

' role="presentation">num

[a]n

um[a

]: 數字

a a

的數量

可得轉移方程 dp

[i+1

][(j

∗10+a

)%k]

=dp[

i+1]

[(j∗

10+a)

%k]+

dp[i

][j]

∗num

[a]' role="presentation">dp[

i+1]

[(j∗

10+a)

%k]=

dp[i

+1][

(j∗10

+a)%

k]+d

p[i]

[j]∗

num[

a]dp

[i+1

][(j

∗10+a

)%k]

=dp[

i+1]

[(j∗

10+a)

%k]+

dp[i

][j]

∗num

[a]由於

b b

太大,用矩陣快速冪加速求解

**

#include

using

namespace

std;

const

int mod = 1e9+7;

int x,num[20];

struct matrix

friend matrix operator * (const matrix &a,const matrix &b)

c.d[i][j] = tmp % mod;

} return c;

}};int main()

matrix a(1,x);

matrix b(x,x);

a.d[0][0] = 1;

for (int j=0;jfor (int t=1;t<=9;t++)

b.d[j][(j*10+t)%x] = (b.d[j][(j*10+t)%x]+num[t]) % mod;

while (b)

printf("%d\n",a.d[0][k]);

}return

0;}

Codeforces 570E,DP 滾動陣列

題意 給定乙個n m的方格,每個各自節點都是乙個小寫字母 範圍 a z 現在從左上角 0,0 點出發,到右下角 n 1,m 1 點停止。問經過的路徑,有多少條路徑上的字目可以構成回文字串。範圍 1 n,m 500 題解 分析 想象成兩個人 a和b 分別從起點和終點出發,當他倆相遇時,走過的路徑相同的...

Codeforces932E DP 組合數學

其實比賽時就想的差不多了。我是從xk x k入手的,看到這個,我就想到 現在有 x x 種東西,放到 k role presentation style position relative k k個不同箱子裡的方案數。然後 k 5000 k 5000 考慮從 k k 入手,f i j role pr...

6 2 1 鄰接矩陣法

圖的儲存 鄰接矩陣法 無向圖 是對稱矩陣,可以壓縮 0表示不連線,1表示連線 有向圖 求度 入度 出度 無向圖 掃瞄一行或者一列的非0元素,得到度 有向圖 出度,掃瞄行 入度,掃瞄列。度 入度 出度 鄰接矩陣法 網 矩陣內標識內標識權值,不存在度則標為無窮大 0或者無窮 表示兩個頂點之間不存在路徑 ...