生活随笔
收集整理的這篇文章主要介紹了
bnu- 34985 Elegant String
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985? ? ? ?
題意:給你0~k個數(shù)組合長度為n的字符串有多少種,這長度為n的字符串的子序列不能存在0~k的全排列。
題解:參考Kefault大牛博客:http://blog.csdn.net/knight_kaka/article/details/38616039? ??
? ? ? ? ? ? ? ? ? ? ? ? ?
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
#define mod 20140518
int 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;}
}
總結
以上是生活随笔為你收集整理的bnu- 34985 Elegant String的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。