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

版权声明:本文为博主原创文章,转载请标明出处 https://blog.csdn.net/MOMING_V/article/details/82948176

10月5日备战Noip2018模拟赛7(B组)

T3 Spread 消息传播

题目描述

众所周知,cyx发明了大量神仙算法 。

cyx每天都发明不同的神仙算法。cyx这天发明cyx树的时候不巧被蒟蒻发现了……蒟蒻迅速将这个消息传播开来。

每个听到这个消息的人首先会震惊一段时间(他怎么又发明新算法了!),但是这样的震惊只会持续2个时刻(因为这对于cyx来说太正常了!)。如果他在第i个时刻听到这个消息,就会从第(i+2)个时刻开始传播这个消息,每个时刻把这个消息告诉两个人,当然他只会告诉不知道这个消息的人。但是当他连续告诉了10个人之后,他就会口干舌燥,停止传播。

蒟蒻在第0时刻发现cyx在发明cyx树(当然蒟蒻也有震惊时间),请问第N时刻共有多少人知道了这个消息?

输入格式

一行一个整数N,表示第N时刻。

输出格式

一行一个整数,表示第N时刻后知道这个消息的总人数。由于知道这件事的人数过于庞大,我们只需要知道一个零头就行了。请输出总人数mod 1000000的结果。

输入样例1

4

输出样例1

11

样例解释1

时刻0:一开始只有蒟蒻知道

时刻2:蒟蒻开始传播,时刻2传播给A和B,时刻3传播给C和D,时刻4传播给E和F;

时刻4:A和B在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<=1000000


思路

仅以此题表示一只蒟蒻对cyx大佬的膜拜

备注:这题答案中知道消息的人不算cyx,因为他不是人,而是神仙

这是一道很明显的DP题, 与兔子问题十分类似,但是这道题有了几个限制条件, 由于cyx太巨了,所以听到消息的蒟蒻都要震惊2个时刻,才去传播消息,而且cyx的神仙事例太多了, 一个蒟蒻讲给10个人听后,就会口干舌燥,不能继续讲了, 一只蒟蒻一个时刻可以传播2个人,所以5个时刻就可以传播10个人, 那么这题的状态转移方程略有不同, f(i)表示 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;
}

猜你喜欢

转载自blog.csdn.net/MOMING_V/article/details/82948176
今日推荐