【NOIP模拟赛】消息传播

编程入门 行业动态 更新时间:2024-10-15 22:27:05

【NOIP模拟赛】<a href=https://www.elefans.com/category/jswz/34/1771421.html style=消息传播"/>

【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模拟赛】消息传播

本文发布于:2024-03-07 09:40:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1717475.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:消息   NOIP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!