10月5日备战Noip2018模拟赛7(B组)
T3 Spread消息传播
题目描述
众所周知,CYX发明了大量神仙算法。
CYX每天都发明不同的神仙算法.cyx这天发明CYX树的时候不巧被蒟蒻发现了......蒟蒻迅速将这个消息传播开来。
每个听到这个消息的人首先会震惊一段时间(他怎么又发明新算法了!),但是这样的震惊只会持续2个时刻(因为这对于CYX来说太正常了!)。如果他在第I个时刻听到这个消息,就会从第(I + 2)个时刻开始传播这个消息,每个时刻把这个消息告诉两个人,当然他只会告诉不知道这个消息的人。但是当他连续告诉了10个人之后,他就会口干舌燥,停止传播。
蒟蒻在第0时刻发现CYX在发明CYX树(当然蒟蒻也有震惊时间),请问第Ñ时刻共有多少人知道了这个消息?
输入格式
一行一个整数N,表示第Ñ时刻。
输出格式
一行一个整数,表示第N时刻后知道这个消息的总人数。由于知道这件事的人数过过庞大,我们只需要知道一个零头就行了。请输出总人数mod 1000000的结果。
输入样例1
4
输出样例1
11
样例解释1
时刻0:一开始只有蒟蒻知道
时刻2:蒟蒻开始传播,时刻2传播给阿和B,时刻3传播给Ç和d,时刻4传播给ë和F;
时刻4:甲和乙在4开始传播,时刻4传播给2×2 = 4个人,传播给H,I,J,K;
最后知道消息的共有:蒟蒻,A,B,C,d,E,F,H,I,J,K,共11个人。
输入样例2
1
输出样例2
1
输入样例3
10
输出样例3
651
数据范围
20%的数据,N <= 20
60%的数据,N <= 1000
100%的数据,N <=百万
思路
仅以此题表示一只蒟蒻对CYX大佬的膜拜
备注:这题答案中知道消息的人不算CYX,因为他不是人,而是神仙
这是一道很明显的DP题,与兔子问题十分类似,但是这道题有了几个限制条件,由于CYX太巨了,所以听到消息的蒟蒻都要震惊2个时刻,才去传播消息,而且CYX的神仙事例太多了,一个蒟蒻讲给10个人听后,就会口干舌燥,不能继续讲了,一只蒟蒻一个时刻可以传播2个人,所以5个时刻就可以传播10个人,那么这题的状态转移方程略有不同,F(I)表示我时刻知道CYX又发明了新算法的蒟蒻数;
f(i)= [f(i - 2) - f(i - 7)] * 2 + f(i - 1)i> = 7
f(i-2)* 2 + f(i-1)i <7
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1000005;
const int MOD = 1000000;
int f[N];
int n, i;
int main ()
{
//freopen ("spread.in", "r", stdin);
//freopen ("spread.out", "w", stdout);
cin >> n;
f[0] = 1;
f[1] = 1;
for (i = 2; i <= n; i ++){
if (i >= 7) f[i] = ((f[i - 2] - f[i - 7]) * 2 + f[i - 1]) % MOD; //7个时刻后就不能讲了
else f[i] = (f[i - 2] * 2 + f[i - 1]) % MOD;
}
cout << (f[n] + MOD) % MOD; //因为每一个f[i]都是取模了的,所以当j > i时, f[j]不一定大于f[i], 因此要加上MOD再取模
//fclose (stdin);
//fclose (stdout);
return 0;
}