原理连接:http://acm.hdu.edu.cn/showproblem.php?pid=2604
题目大意:含有fmf或者fff的队列称为O类型队列。其余为E类型队列。
求 E类型队列的数量 对 给定值M 取余。
递推公式:
F(n)=F(n-1)+F(n-3)+F(n-4)
在保证不重复且满足的条件的情况下,(自己可通过排除的方法得到以下)
F(n-1) 末尾为 m
F(n-3) 末尾为 mmf
F(n-4) 末尾为 mmff
从而得出递推公式。
还需要注意点,数组用char类型否则超内存,short int也不行。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1000000 + 1;
char dt[30][N]; //节省内存所以 一维数字-1 为 对应 M的取余
int main()
{
for (int i = 1; i <= 30; i++)
{
dt[i-1][1] = 2 % i;
dt[i-1][2] = 4 % i;
dt[i-1][3] = 6 % i;
dt[i-1][4] = 9 % i;
for (int j = 5; j <= 1000000; j++)
{
dt[i-1][j] = (dt[i-1][j - 1] + dt[i-1][j - 3] + dt[i-1][j - 4])%i;
}
}
int L,M;
while (scanf_s("%d%d", &L, &M) == 2)
{
printf("%d\n", dt[M-1][L]);
}
return 0;
}