题目描述
作为队伍的核心,forever97很受另外两个队友的尊敬。
Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家forever97爱吃的外卖。
如果Trote_w给forever97买了别家的外卖,forever97就会大喊“我不吃我不吃”。
但是forever97又不喜欢连续三天吃一种外卖。
如果Trote_w哪天忘了这件事并且三天给他买了同一家外卖,那么forever97就会把Trote_w的头摁进手机屏幕里。
作为Trote_w的好朋友,你能告诉他连续请forever97吃n天饭,有多少不同的购买方法吗?
输入描述:
多组样例 第一行一个整数T(1<=T<=20)代表测试样例数
接下来t行每行一个整数n,代表Trote_w要请forever97吃n天饭(1<=n<=100000)
输出描述:
输出T个整数代表方案数,由于答案太大,你只需要输出mod 1e9+7 后的答案即可。
示例1
输入
2
3
500
输出
24
544984352
状态表示:
f[0][i] 表示第0家前i天购买总方案数
f[1][i]表示第1家购买总方案数
f[2][i]表示第2家购买总方案数
根据连续三天不去同一家
第i天去了第0 家
第i-1天不去第0家,第i-2天去第1家或第2家
第i-1天去第0家,那么第i-2天去第1家或第2家
其他家类似
故
f[0][i] = f[1][i-1] + f[2][i-1] + f[1][i-2] + f[2][i-2]
f[1][i]=f[0][i-1] + f[2][i-1] + f[0][i-2] + f[2][i-2]
f[2][i]=f[1][i-1] + f[0][i-1] + f[1][i-2] + f[0][i-2]
初始值:
f[0][0] = f[1][0] = f[2][0] = 0;
f[0][1] = f[1][1] = f[2][1] = 1;
f[0][2] = f[1][2] = f[2][2] = 3;
很容易发现第i天去哪一家都是一样的,所以可以使用一维数组。
初始值:
a[0] = 0
a[1] = 3
a[2] = 9
a[i] = a[i-1]*2+a[i-2]*2
#include<iostream>
using namespace std;
const int N = 100001;
int mod = 1e9+7;
int main()
{
int a[N];
int T,n;
a[0] = 0;
a[1] = 3;
a[2] = 9;
for(int i = 3; i < N; i++)
{
a[i] = (a[i-1]*2%mod+a[i-2]*2%mod)%mod;
}
cin >> T;
for(int k = 0; k < T; k++)
{
cin >> n;
cout << a[n] << endl;
}
return 0;
}