对应HDU题目:点击打开链接
3 8 4 7 4 8
6 2 1
思路:引用别人解释:
用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1);
如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是
mmf的话那么前n-3可以找满足条件的即:f(n-3);如果是mff的话,再往前考虑一位的话只有mmff满足条件即:f(n-4)
所以f(n)=f(n-1)+f(n-3)+f(n-4),递推会跪,可用矩阵快速幂
构造一个矩阵:
#include <stdio.h> #include <stdlib.h> #include <string.h> int f[5], mod; typedef struct { int a[4][4]; }Matrix; Matrix A, B; void Init() { int i,j; memset(A.a, 0, sizeof(A)); memset(B.a, 0, sizeof(B)); for(i=0; i<4; i++) B.a[i][i] = 1; A.a[0][0] = 1; A.a[0][2] = 1; A.a[0][3] = 1; A.a[1][0] = 1; A.a[2][1] = 1; A.a[3][2] = 1; } Matrix Matrix_mul(Matrix X, Matrix Y) { Matrix tmp; memset(tmp.a, 0, sizeof(tmp)); int i,j,k; for(i=0; i<4; i++) for(j=0; j<4; j++) for(k=0; k<4; k++){ tmp.a[i][j] += (X.a[i][k] * Y.a[k][j]) % mod; tmp.a[i][j] %= mod; } return tmp; } void Solve(int n) { while(n) { if(n & 1) B = Matrix_mul(B, A); A = Matrix_mul(A, A); n >>= 1; } } int main() { //freopen("in.txt", "r", stdin); int n; while(~scanf("%d%d", &n, &mod)) { Init(); f[1] = 2 % mod; f[2] = 4 % mod; f[3] = 6 % mod; f[4] = 9 % mod; if(n <= 4){ printf("%d\n", f[n]); continue; } Solve(n - 4); int i; int ans = 0; for(i=0; i<4; i++) ans += (B.a[0][i] * f[4 - i]) % mod; ans %= mod; printf("%d\n", ans); } return 0; }
原文:http://blog.csdn.net/u013351484/article/details/44035045