题解 BZOJ 1002 【[FJOI2007]轮状病毒】
2024-10-21 16:39:25
emm……
正解:矩阵树定理,但是本宝宝不会求基尔霍夫矩阵。
开始考场方法:
手动模拟$n=1--5$时的答案(数不大,~~画画就出来了~~要画上半个小时)。
画出来,答案是这样的:$1$ $5$ $16$ $45$ $121$
然后简单根据题目出处和难度蒙了一下感觉第$n$项的答案和$n-1$,$n-2$的答案有关。
再看看增长率$(\frac{ans[n-1]}{ans[n-2]})$大概是$2--3$之间,并且比较靠近三。
于是,就想 $ans[n]$ $=$ $ans[n-1]*3$ $±$ $……$
又因为差的不是一个常数,所以
$ans[n]$ $=$ $3*ans[n-1]-ans[n-2]$ $±$ $……$
之后,惊喜的发现每个$ans[n]$ 与 $3*ans[n-1]-ans[n-2]$ 都差$2$。
最终,蒙了一个表达式:$ans[n]=$ $3*ans[n-1]-ans[n-2]+2$
看数据范围,需要高精。
之后一脸懵逼的$AC$了。
代码附上:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//F(n)=3*F(n-1)-F(n-2)+2,F(1)=1,F(2)=5.;
int ans[][];
int len[];
int mul[];
void pluse(int x)
{
int m=x-;
int n=x-;
int cnt=;int l=len[n];
for(int i=;i<=l;i++)
{
mul[i]=(ans[n][i]*+cnt)%;
cnt=(ans[n][i]*+cnt)/;
}
if(cnt!=) mul[++l]=cnt; cnt=;
for(int i=;i<=l;i++)
{
ans[x][i]=(mul[i]-ans[m][i]+cnt+)%;
if(mul[i]-ans[m][i]+cnt<) cnt=-;
else cnt=(mul[i]-ans[m][i]+cnt)/;
}
if(cnt!=) ans[x][l+]=cnt,len[x]=l+;
else len[x]=l;
return ;
}
int n;
int main()
{
scanf("%d",&n);
ans[][]=;len[]=;
ans[][]=;len[]=;
for(int i=;i<=n;i++) pluse(i);
for(int i=len[n];i>=;i--) printf("%d",ans[n][i]);
return ;
}
最新文章
- T-Sql(七)用户权限操作(grant)
- java画图程序_图片用字母画出来_源码发布
- uialertview 改变文字显示位置
- Linux 命令 - crontab: 任务调度
- Geographic Coordinate Systems
- ssl error rx record too long
- Administration Commands
- Linux下定时备份数据库
- find the mincost route(floyd变形 无向图最小环)
- Linux的错误码
- scrapy架构初探
- Android系统修改硬件设备访问权限
- 7K - find your present (2)
- P、NP、NPC、NP-Hard问题到底是何方神圣?
- windows本地eclispe运行linux上hadoop的maperduce程序
- Java 学习 注解
- 移动端页面利用好viewport,适配各种宽度屏幕
- Noi.ac #309. Mas的童年(贪心)
- [UGUI]图文混排(六):点击区域
- 绝对路径${pageContext.request.contextPath}
热门文章
- Win7开始菜单所在目录
- leetcode606
- 「小程序JAVA实战」 小程序默认加载的页面和生命周期(八)
- MATLAB和C语言混合编程-----Matlab7.0 编译器设置
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart)
- 6410在rvds下编译启动代码报错分析
- 局域网内的一些计算机可以ping通 有些ping不同
- obj.get_字段名称_display
- Spring总结九:事务管理机制
- Django框架 之 Ajax