题目描述
众所周知,计算机系搬到中关村校区的学姐们贼好看了,这就导致每天看学姐的人超多,进而导致每天食堂打饭的人数暴涨,所以一到饭点食堂就会出现一个超长的打饭队列,考虑到三个女人一台戏以及一个男生前后都是女生会让他害羞的情况,我们称没有这两种情况的打饭队列为呵呵列。有一天数学系的一个学长去食堂吃饭,饭后无聊突然想知道n个人能够形成多少呵呵列,机智的他O(瞬)就知道了结果,还将结果模了个666告诉你,而你是计算机系的,能不懂嘛,快拿出电脑解决这个问题吧输入
第一行一整数T表示用例组数,每组用例占一行输入一个整数n表示打饭的人数
输出
对于每组用例,输出一个整数占一行表示呵呵列的数量,结果模666
数据范围
1<=T<=1000,n<=1000000
样例输入
1
3
样例输出
6
样例解释
男男男 男男女 女男男 女女男 女男女 男女女
上述题目可以用dp来写,但是我们这里先介绍一种找规律的方法。
第一种: 如果我们把男生当作1,把女生当作0的话,这样我们可以通过简单的列举,算出前几个的个数。 人数:1 2 3 4 5 6 7 8 个数:2 4 6 9 15 25 40 64 我就算了前8个,然后发现从第三个数开始,都和前两个数有关系,比如第三个数是前两个数之和,第四个数是前两数之和减一,第五个数就是前两个数之和,第六个数就是前两个数之和加一…… 如此,我们不难发现,从第三个数开始,如果是奇数,那么它的个数就等于前两个数之和,如果是偶数,那么就分为两种情况,如果除以2还是偶数,那么它的个数就是前两个数之和减一,如果是奇数的话,那么它的个数就是前两个数之和加一。这样我们就可以写出代码来了。
if (i % 2 == 1) dp[i] = dp[i - 2] + dp[i - 1]; else { if ((i / 2) % 2 == 0) dp[i] = dp[i - 2] + dp[i - 1] - 1; else dp[i] = dp[i - 2] + dp[i - 1] + 1; } dp[i] = dp[i] % 666; “`
这是关键的代码段,这里还有一个减时间的东西,就自己想啦,不写了。
第二种: 我认为这样写是dp的方法,是我的一个同学想到的。 同样的,男为1,女为0,这样不允许存在的情况是000和010,这样我们取一个dp数组,dp[i]表示当前的个数,但是显然这样是不够的,然后他就加大了这个数组,为dp[i][0][0]到dp[i][1][1],这样的三维数组,第二维表示前一个位置是男是女,第三维表示前一个的前一个是男是女,这样就可以得出dp[i][0][0] = dp[i - 1][0][1],同样我们也可以得出其它的,然后加起来就是最后的答案了,这个方法不是我想的,就不详细介绍了,就当给点思路吧。