題意有 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或者無窮 表示兩個頂點之間不存在路徑 ...