备战Noip2018模拟赛7 (B组) T3 Spread 消息传播

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;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值