【NOIP2013模拟联考6】选课(select)

探讨一个特殊的选课系统问题,该系统限制了课程的选择方式,并要求计算合法选课方案的数量。通过观察规律找到解决方案并实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
你真的认为选课是那么容易的事吗?HYSBZ的ZY同志告诉你,原来选课也会让人产生一种想要回到火星的感觉。假设你的一周有n天,那么ZY编写的选课系统就会给你n堂课。但是该系统不允许在星期i和星期i+1的时候选第i堂课,也不允许你在星期n和星期一的时候选第n堂课。然后连你自己也搞不清哪种选课方案合法,哪种选课不合法了。你只想知道,你到底有多少种合法的选课方案。

Input
有多组数据,请读到文件末结束。

对于每组数据仅一行,1个正整数 n。

Output
对于每组输出只有一行,1个非负整数,为选课方案数量 mod (10^9+7).

Sample Input
2

4

Sample Output
0

2

【样例解释】

对于样例二:
周一上第二堂课,周二上第三堂课,周三上第四堂课,周四上第一堂课;
周一上第三堂课,周二上第四堂课,周三上第一堂课,周四上第二堂课。
共2种选课方案。

Data Constraint
对于第i组数据,n<=10*i, 1<=i<=3
对于100%的数据:1<=n<=100000
.
.
.
.
.

分析

水法真神奇,暴力出奇迹!!!
考场某人打表找规律发现答案的前缀和 f
满足 f[i]=(f[i−1]+f[i−2])∗(i−1)+f[i−3]
.
.
.
.
.

程序:
#include<iostream>
using namespace std;
int main()
{
    int module=1000000007,n;
    long long f[100001];
    f[1]=f[2]=0;
    f[3]=1;
    for (int i=4;i<=100000;i++)
    {
        f[i]=(f[i-1]+f[i-2])*(i-1)+f[i-3];
        f[i]%=module;
    }
    cin>>n;
    while (n!=0)
    {
        cout<<(f[n]-f[n-1]+module)%module<<endl;
        n=0;
        cin>>n;
        if (n==0) break;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值