舔狗舔到最后一无所有

题目描述
作为队伍的核心,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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值