本文共 1714 字,大约阅读时间需要 5 分钟。
题意:给你0~k个数组合长度为n的字符串有多少种,这长度为n的字符串的子序列不能存在0~k的全排列。
题解:参考大牛博客:
#include#include #include #include using namespace std;typedef long long LL;#define mod 20140518int k;struct Z{ LL m[10][10]; Z(){memset(m,0,sizeof(m));} void init(){//单位矩阵 for(int i = 0;i < k;i++) m[i][i] = 1; } void Init(){//构造矩阵 for(int i = 0;i < k;i++) for(int j = 0;j <=i ;j++) m[i][j] = 1; for(int i = 0;i < k-1;i++) m[i][i+1] = k - i; }};Z operator * (Z a, Z b){//矩阵乘法 Z c; for(int i = 0;i < k;i++) for(int r = 0;r < k;r++) for(int j = 0;j < k;j++) c.m[i][j] = (c.m[i][j] + a.m[i][r]*b.m[r][j]) % mod; return c;}Z Pow(LL n){//快速幂 Z ret,s; ret.init();s.Init(); while(n){ if(n&1) ret = ret * s; s = s * s; n >>= 1; } return ret;}int main(){ int t,ca = 1; LL n; cin >> t; while(t--){ cin >> n >> k; printf("Case #%d: ",ca++); Z ret; ret = Pow(n-1); LL ans = 0; for(int i = 0;i < k;i++) ans = (ans + ret.m[0][i] * (k+1)) % mod; cout << ans << endl; }}
转载地址:http://ycsgi.baihongyu.com/