http://blog.csdn.net/tobewhatyouwanttobe/article/details/39697215
当k==5时,
【k+1,0,0,0,0】*A^(n-1)=【a,b,c,d,e】
a+b+c+d+e即为结果;
A:
1 5 0 0 0
1 1 4 0 0
1 1 1 3 0
1 1 1 1 2
1 1 1 1 1
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const ll mod=20140518;
struct node
{
ll a[11][11];
}T,I;
int k;
node multi(node A,node B)
{
int i,j,l;
node C;
memset(C.a,0,sizeof(C.a));
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
for(l=0;l<k;l++)
{
C.a[i][j]+=A.a[i][l]*B.a[l][j];
C.a[i][j]%=mod;
}
C.a[i][j]=(C.a[i][j]+mod)%mod;
}
return C;
}
int main()
{
int t;
scanf("%d",&t);
int res=0;
while(t--)
{
res++;
ll n;
int i,j;
cin>>n>>k;
if(n==1)
{
printf("Case #%d: %lld\n",res,(k+1));
continue;
}
n--;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
if(i==j) I.a[i][j]=1;
else I.a[i][j]=0;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
if(i>=j) T.a[i][j]=1;
else if(i+1==j) T.a[i][j]=k-i;
else T.a[i][j]=0;
}
while(n)
{
if(n&1) I=multi(I,T);
n>>=1;
T=multi(T,T);
}
ll ans=0;
for(i=0;i<k;i++)
{
ans+=I.a[0][i];
ans%=mod;
}
ans=ans*(k+1)%mod;
printf("Case #%d: %lld\n",res,ans);
}
}