标签:des style http color io os java ar strong
3 8 4 7 4 8
6 2 1
记答案为f[n],则易得f[0]=0,f[1]=2,f[2]=4,f[3]=6;f[[4]=9;
当长度为N时,若最后一个字符为M,前N-1个字符没有限制,即为F(N-1);
当最后一个字符串为F的时候,就必须去除最后3个字符是fmf和fff的情况(倒数第二个字符为F、M均有可能会不满足情况),此时最后3个字符可能为mmf和mff;
当后3个字符为mmf时,前N-3个字符没有限制,即F(N-3);
但是当最后四个字符为mmff时,前N-4个字符无限制,即为F(N-1);
即f[n]=f[n-1]+f[n-3]+f[n-4];
转化为矩阵即为:1 0 1 1 F(N-1) F(N) (即是f[n]=1*f[n-1]+0*f[n-2]+1*f[n-3]+1*f[n-4];)
1 0 0 0 * F(N-2) = F(N-1) (下面为单位矩阵)
0 1 0 0 F(N-3) F(N-2)
0 0 1 0 F(N-4) F(N-3)
#include"iostream" #include"stdio.h" #include"string.h" #include"algorithm" #include"queue" #include"vector" using namespace std; #define N 4 #define LL __int64 struct Mat { LL mat[N][N]; }; int M,n=4; int p[5]={0,2,4,6,9}; Mat operator *(Mat a,Mat b) { int i,j,k; Mat c; memset(c.mat,0,sizeof(c.mat)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { c.mat[i][j]=0; for(k=0;k<n;k++) { c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%M; } c.mat[i][j]%=M; } } return c; } int fun(Mat &a,int k) { int i; Mat ans; memset(ans.mat,0,sizeof(ans.mat)); for(i=0;i<n;i++) ans.mat[i][i]=1; while(k) { if(k&1) ans=ans*a; k>>=1; a=a*a; } LL s=0; for(i=0;i<n;i++) { s+=ans.mat[0][i]*p[n-i]; s%=M; } return s; } int main() { int i,l; Mat a; while(scanf("%d%d",&l,&M)!=-1) { if(l<=n) { printf("%d\n",p[l]%M); continue; } memset(a.mat,0,sizeof(a.mat)); a.mat[0][0]=a.mat[0][2]=a.mat[0][3]=1; for(i=1;i<n;i++) a.mat[i][i-1]=1; printf("%d\n",fun(a,l-4)); } return 0; }
标签:des style http color io os java ar strong
原文地址:http://blog.csdn.net/u011721440/article/details/39377631