表示我这种蒟蒻面对这种递推第一思想显然是打表啊

先贴个用来打表的暴力:

#include <cstdio>
struct node
{
    int l,r;
}p[];
bool used[];
int f[];
int n,cnt,cct;
int findf(int x)
{
    if(x==f[x])
    {
        return x;
    }
    return f[x]=findf(f[x]);
}
bool check()
{
    for(int i=;i<=n+;i++)
    {
        f[i]=i;
    }
    for(int i=;i<=cct;i++)
    {
        if(used[i])
        {
            int f1=findf(p[i].l);
            int f2=findf(p[i].r);
            f[f2]=f1;
        }
    }
    int ff=;
    for(int i=;i<=n+;i++)
    {
        int f1=findf(i);
        if(!ff)
        {
            ff=f1;
        }else if(ff!=f1)
        {
            return ;
        }
    }
    return ;
}
void dfs(int dep,int tot)
{
    if(dep==cct+)
    {
        if(tot==n)
        {
            if(check())
            {
                cnt++;
            }
        }
        return;
    }
    used[dep]=;
    dfs(dep+,tot+);
    used[dep]=;
    dfs(dep+,tot);
}
int main()
{
    scanf("%d",&n);    
    for(int i=;i<=n+;i++)
    {
        p[++cct].l=;
        p[cct].r=i;    
    }
    for(int i=;i<=n+;i++)
    {
        if(i==n+)
        {
            p[++cct].l=i;
            p[cct].r=;
        }else
        {
            p[++cct].l=i;
            p[cct].r=i+;
        }
    }
    dfs(,);
    printf("%d\n",cnt);
    return ;
}
/*
1 1
2 5
3 16
4 45
5 121
6 320
*/

实测这个打表程序是正确的(可以获得30分)

接下来是本人心路历程:

观察一下:1-1,2-5,3-16,4-45...找一下前后项吧!

观察前后项的倍数关系应该在2~3之间,那先定一个基础表达式

f[i]=2f[i-1]+...或f[i]=3f[i-1]+...

如果系数用2,发现剩下的部分长这样啊...

f[3]=2f[2]+6

f[4]=2f[3]+13

f[5]=2f[4]+31

...

好像后面的没啥规律...

那换系数用3!

f[4]=3f[3]-3

f[5]=3f[4]-14

...

好像也没啥啊...

等一下!

-3=-5+2

-14=-16+2

如果下面再写下来,应该是-43=-45+2!

这不就找出来了吗!

f[i]=3f[i-1]-f[i-2]+2!

于是敲个高精度这题就结束了...

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Bignum
{
int a[10005];
int ilen;
}f[105],zero;
int n;
Bignum add(Bignum x)
{
Bignum ret=x;
ret.a[1]+=2;
int i=1;
while(ret.a[i]>=10)
{
ret.a[i+1]+=ret.a[i]/10;
ret.a[i]%=10;
i++;
}
if(ret.a[ret.ilen+1])
{
ret.ilen++;
}
return ret;
}
Bignum mul(Bignum x)
{
Bignum ret=zero;
for(int i=1;i<=x.ilen;i++)
{
ret.a[i]+=3*x.a[i];
ret.a[i+1]+=ret.a[i]/10;
ret.a[i]%=10;
}
ret.ilen=x.ilen;
while(ret.a[ret.ilen+1])
{
ret.ilen++;
}
return ret;
}
Bignum sub(Bignum x,Bignum y)
{
Bignum ret=zero;
for(int i=1;i<=y.ilen;i++)
{
ret.a[i]+=x.a[i]-y.a[i];
if(ret.a[i]<0)
{
ret.a[i]+=10;
ret.a[i+1]--;
}
}
for(int i=y.ilen+1;i<=x.ilen;i++)
{
ret.a[i]+=x.a[i];
}
ret.ilen=x.ilen;
while(!ret.a[ret.ilen]&&ret.ilen>1)
{
ret.ilen--;
}
return ret;
}
int main()
{
scanf("%d",&n);
f[1].a[1]=1;
f[1].ilen=1;
f[2].a[1]=5;
f[2].ilen=1;
f[3].a[1]=6;
f[3].a[2]=1;
f[3].ilen=2;
for(int i=4;i<=n;i++)
{
f[i]=mul(f[i-1]);
f[i]=add(f[i]);
f[i]=sub(f[i],f[i-2]);
}
for(int i=f[n].ilen;i>=1;i--)
{
printf("%d",f[n].a[i]);
}
printf("\n");
return 0;
}

  

bzoj 1002的更多相关文章

  1. bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Statu ...

  2. BZOJ 1002 轮状病毒

    Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...

  3. 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3928  Solved: 2154[Submit][Statu ...

  4. BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3106  Solved: 1724[Submit][Statu ...

  5. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Statu ...

  6. BZOJ 1002 - 轮状病毒 - [基尔霍夫矩阵(待补)+高精度]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生 ...

  7. bzoj 1002 [FJOI2007]轮状病毒——打表找规律

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...

  8. BZOJ 1002 轮状病毒 矩阵树定理

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1002 题目大意: 给定n(N<=100),编程计算有多少个不同的n轮状病毒 思路 ...

  9. AC日记——[FJOI2007]轮状病毒 bzoj 1002

    1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...

  10. BZOJ 1002 [ FJOI 2007 ]

    -------------------------萌萌哒分割线------------------------- 题目很容易看懂,数据范围也不大.当然可以卡过暴力的人了. 在n=1时很明显是一种,如下 ...

随机推荐

  1. ubuntu 简单安装配置gitlab

    安装 gitlab-ce 社区版 依赖 sudo apt-get install curl openssh-server ca-certificates postfix 添加gitlab包服务并安装 ...

  2. Shiro入门 - 通过自定义Realm连数数据库进行授权

    shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...

  3. 基于netty的一款http server

    cicada 基本功能 1.基于注解.注解扫描 2.ioc 对象管理 3.intercepter 拦截器 ref https://github.com/TogetherOS/cicada

  4. 【Ubuntu】如何修改IP

    前几天有幸捣鼓了一下Ubuntu系统,和Linux系统差不多,在这里说说如何修改IP           1,首先使用命令ifconfig查看当前IP,如图           2,编辑文件,输入命令 ...

  5. Datasnap 服务端 (Server)Session 管理 --- 解决 全示例慢(Google)

    Datasnap 服务端 (Server)Session  管理:  http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Server_Side_Ses ...

  6. XE7/X10.2 Datasnap使用 dbExpress 连接MySQL数据库

    本人使用:DELPHI X10.2.2 版本连接 MYSQL 5.1 (安装 mysql-5.1.72-win32.msi)的32位版本,开始连接不了: 将 MYSQL 5.1 安装目录下bin 中的 ...

  7. 理解OAuth 2.0(转)

      OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料 ...

  8. ACM Computer Factory POJ - 3436 网络流拆点+路径还原

    http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...

  9. DbProviderFactory

    背景 在此之前,我一直以为调用哪个数据库就要用它专门的链接,除非是odbc方式.后来用了java,想.net怎么没有通用的链接呢,尤其是oracle,还要装他的客户端,如此不方便竟然能流行起来.后来知 ...

  10. QT 出现信号槽不触发的问题

    主要有以下三点: 1)槽函数未声明为 slots 类型, 信号函数未声明为 signals所致 2)槽函数和信号函数的参数不一致所致 3)connect关联时失败