2014北京邀请赛 E Elegant String bunoj 34985 矩阵快速幂

来源:互联网 发布:js图片上传插件 编辑:程序博客网 时间:2024/06/05 09:08

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 longconst 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);}}


0 0
原创粉丝点击