题解 BZOJ 1002 【[FJOI2007]轮状病毒】

题目链接

emm……

正解:矩阵树定理,但是本宝宝不会求基尔霍夫矩阵。

开始考场方法:

手动模拟n=15时的答案(数不大,~~画画就出来了~~要画上半个小时)。

画出来,答案是这样的:1 5 16 45 121

然后简单根据题目出处和难度蒙了一下感觉第n项的答案和n1,n2的答案有关。

再看看增长率(ans[n1]ans[n2])大概是23之间,并且比较靠近三。

于是,就想 ans[n] = ans[n1]3 ±

又因为差的不是一个常数,所以
ans[n] = 3ans[n1]ans[n2] ±

之后,惊喜的发现每个ans[n]3ans[n1]ans[n2] 都差2

最终,蒙了一个表达式:ans[n]= 3ans[n1]ans[n2]+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[103][10010];
int len[103];
int mul[10010];
void pluse(int x)
{
    int m=x-2;
    int n=x-1;
    int cnt=0;int l=len[n];
    for(int i=1;i<=l;i++)
    {
        mul[i]=(ans[n][i]*3+cnt)%10;
        cnt=(ans[n][i]*3+cnt)/10;
    }
    if(cnt!=0) mul[++l]=cnt;
    
    cnt=2;
    for(int i=1;i<=l;i++)
    {
        ans[x][i]=(mul[i]-ans[m][i]+cnt+100)%10;
        if(mul[i]-ans[m][i]+cnt<0) cnt=-1;
        else cnt=(mul[i]-ans[m][i]+cnt)/10;
    }
    if(cnt!=0) ans[x][l+1]=cnt,len[x]=l+1;
    else len[x]=l;
    return ;
}
int n;
int main()
{
    scanf("%d",&n);
    ans[1][1]=1;len[1]=1;
    ans[2][1]=5;len[2]=1;
    for(int i=3;i<=n;i++) pluse(i);
    for(int i=len[n];i>=1;i--) printf("%d",ans[n][i]);
    return 0;
}
复制代码

 

posted @   米罗偕涯  阅读(227)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)
点击右上角即可分享
微信分享提示