消息传播"/>
【NOIP模拟赛】消息传播
消息传播
- Description
众所周知,HYF有很多小姊妹。 HYF每天放学之后都要跟(不同的)MM约会。HYF这天约会的时候不巧被jzt撞上了……虽然换一个新的MM约会这种事情对于HYF来说如同家常便饭,所谓“好事不出门,坏事传千里”,jzt迅速将这个消息传播开来。 每个听到这个消息的人首先会震惊一段时间(他怎么又换MM了- -~!),但是这样的震惊只会持续2个时刻(因为这对于HYF来说太正常了= =~!)。如果他在第i个时刻听到这个消息,就会从第(i+2)个时刻开始传播这个消息,每个时刻把这个消息告诉两个人,当然他只会告诉不知道这个消息的人。但是当他连续告诉了10个人之后,他就会口干舌燥,停止传播。 jzt在第0时刻撞到HYF(当然jzt也有震惊时间),请问第N时刻共有多少人知道了这个消息?
- Input Format
一行一个整数N,表示第N时刻。
- Output Format
一行一个整数,表示N分钟后知道这个消息的总人数。
- Sample Input
【输入样例1】
4
【输入样例2】
1
【输入样例3】
10
- Sample Output
【输出样例1】
11
【输出样例2】
1
【输出样例3】
651
- Hint
【样例1解释】
时刻0:一开始只有jzt知道
时刻2:jzt开始传播,时刻2传播给A和B,时刻3传播给C和D,时刻4传播给E和F;
时刻4:A和B在4开始传播,时刻4传播给2×2=4个人,传播给H、I、J、K;
最后知道消息的共有:jzt,A,B,C,D,E,F,H,I,J,K,共11个人。
【数据规模】
20%的数据,N<=20
60%的数据,N<=1000
100%的数据,N<=10000
- 分析
很简单可以推出一个动规方程
F[i]=F[i−1]+2∗(F[i−2]−F[i−7])我们可以开一个循环数组记录 F <script type="math/tex" id="MathJax-Element-4">F</script> (好像不开循环数组也可以过),显然需要高精度。(表示竟然不需要压位!)
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct BigInt{int num[3000];};
BigInt Tag[8],Two;
const int Mod=10000;
int n;
BigInt operator + (BigInt A,BigInt B){int len=max(A.num[0],B.num[0]);for (int i=1;i<=len;i++) A.num[i]+=B.num[i];for (int i=1;i<=len;i++)if (A.num[i]>=Mod) A.num[i+1]+=A.num[i]/Mod,A.num[i]%=Mod;for (len++;A.num[len];len++) A.num[len+1]+=A.num[len]/Mod,A.num[len]%=Mod;A.num[0]=--len;return A;
}
BigInt operator - (BigInt A,BigInt B){if (!B.num[0]) return A;int len=max(A.num[0],B.num[0]);for (int i=1;i<=len;i++) A.num[i]-=B.num[i];for (int i=1;i<=len;i++)if (A.num[i]<0) A.num[i+1]--,A.num[i]+=Mod;for (len;A.num[len]==0;len--);A.num[0]=len;return A;
}
int main(){freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);Tag[0].num[0]=Tag[0].num[1]=1;Two.num[0]=1; Two.num[1]=2;scanf("%d",&n);int h=1;for (int i=1;i<=n;i++,h=(h+1)%7){Tag[h]=Tag[(h+5)%7]-Tag[h];Tag[h]=Tag[h]+Tag[h];Tag[h]=Tag[h]+Tag[(h+6)%7];}h=(h+6)%7;printf("%d",Tag[h].num[Tag[h].num[0]]);for (int i=Tag[h].num[0]-1;i;i--) printf("%.4d",Tag[h].num[i]);fclose(stdin); fclose(stdout);return 0;
}
更多推荐
【NOIP模拟赛】消息传播
发布评论