标签:its isp opera sample with ini play ogr input
Description
Input
Output
Sample Input
3 8
4 7
4 8
Sample Output
6
2
1
给你一个只有f和m,长度为l的字符串,让你找出满题条件的串的个数对m取余的数。如果这个串中不含fff和fmf就说这个串是满足条件的。
假设现有长度为n的串s,f(n)是s串满足条件的答案。f(n)怎么推出来捏?
如果s的最后一位为m,那么就加上f(n-1),因为在长度为n-1的满足条件的串后面加上一个m所得到的串肯定也满足条件。
如果s的最后一位为f,那么s的最后三位只有mmf和mff两种情况!继续讨论!
如果s以mmf结尾,那么加上f(n-3),因为在长度为n-3的满足条件的串后面加上一个mmf所得到的串肯定也满足条件。
那如果s以mff结尾呢?向前思考一位,倒数第四位只能是m,也就是此时s是以mmff结尾的,再加上f(n-4)岂不是美滋滋?
综上f(n)=f(n-1)+f(n-3)+f(n-4)。无耻的再盗张图...OTZ...
代码如下:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int N=4; 5 int l,m; 6 struct Matrix 7 { 8 long long int mat[N][N]; 9 }matrix; 10 void init() 11 { 12 memset(matrix.mat,0,sizeof matrix.mat); 13 matrix.mat[0][0]=1; 14 matrix.mat[0][1]=0; 15 matrix.mat[0][2]=1; 16 matrix.mat[0][3]=1; 17 for (int i=1;i<N;++i) 18 { 19 for (int j=0;j<N;++j) 20 { 21 if (i==j+1) 22 matrix.mat[i][j]=1; 23 } 24 } 25 } 26 Matrix operator * (Matrix a,Matrix b) 27 { 28 Matrix c; 29 for (int i=0;i<N;++i) 30 { 31 for (int j=0;j<N;++j) 32 { 33 c.mat[i][j]=0; 34 for (int k=0;k<N;++k) 35 c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; 36 c.mat[i][j]%=m; 37 } 38 } 39 return c; 40 } 41 Matrix Pow (int n) 42 { 43 Matrix t; 44 if (n==1) 45 return matrix; 46 if (n&1) 47 return matrix*Pow(n-1); 48 else 49 { 50 Matrix temp=Pow(n>>1); 51 return temp*temp; 52 } 53 } 54 int main() 55 { 56 //freopen("de.txt","r",stdin); 57 long long int f[5]; 58 f[0]=0; 59 f[1]=2; 60 f[2]=4; 61 f[3]=6; 62 f[4]=9; 63 while (~scanf("%d%d",&l,&m)) 64 { 65 init(); 66 if (l<=4) 67 { 68 printf("%lld\n",f[l]%m); 69 continue; 70 } 71 Matrix temp=Pow(l-4); 72 long long int ans=0; 73 for (int i=0;i<N;++i) 74 { 75 ans += temp.mat[0][i]*f[N-i]; 76 ans%=m; 77 } 78 printf("%lld\n",ans); 79 } 80 return 0; 81 }
标签:its isp opera sample with ini play ogr input
原文地址:http://www.cnblogs.com/agenthtb/p/6013427.html