HDU2294 Pendant 矩阵应用

来源:互联网 发布:机电软件 编辑:程序博客网 时间:2024/05/16 14:12
/*矩阵结合DPdp[i][j]表示长度为i的pendant,用了j种珍珠,所构成的方案数,则dp[i][j] = dp[i-1][j] * j + dp[i-1][j-1] * (k-j+1)。ans[n]  = dp[1][k]+…+dp[n][k] = ans[n-1] + dp[n][k]。结合矩阵特性,并在矩阵中同时求出ans令:Fn(1,k+1) = |dp[n][1] dp[n][2] …… dp[n][k] ans[n-1]|F1(1,k+1) = |k                                       |             |1 k-1            | |   2  k-2        |A(k+1,k+1) = |…………   | |k 1| |                1|Fn = F1 * A ^ (n-1)*/#include "Mat.h"#include <iostream>using namespace std;int main(){int t, n, k, i;__int64 ans;mod = 1234567891;Mat A, F;scanf("%d", &t);while(t--){scanf("%d%d", &n, &k);A.ReSize(k+1, k+1);F.ReSize(1, k+1);for(i = 0;i < k; ++i)          {              A.s[i][i+1]=k-i-1;              A.s[i][i]=i+1;          }A.s[k][k] = 1;A.s[k-1][k] = 1;F.s[0][0] = k % mod;//因为求的是ans[n],所以多乘一次A.Er_work(n);F.Multiply(A);ans = F.s[0][k];printf("%I64d\n", ans);}return 0;}

原创粉丝点击