bzoj 1002
表示我这种蒟蒻面对这种递推第一思想显然是打表啊
先贴个用来打表的暴力:
- #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的更多相关文章
- bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2234 Solved: 1227[Submit][Statu ...
- BZOJ 1002 轮状病毒
Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...
- 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3928 Solved: 2154[Submit][Statu ...
- BZOJ 1002 [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3106 Solved: 1724[Submit][Statu ...
- BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5577 Solved: 3031[Submit][Statu ...
- BZOJ 1002 - 轮状病毒 - [基尔霍夫矩阵(待补)+高精度]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生 ...
- bzoj 1002 [FJOI2007]轮状病毒——打表找规律
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...
- BZOJ 1002 轮状病毒 矩阵树定理
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1002 题目大意: 给定n(N<=100),编程计算有多少个不同的n轮状病毒 思路 ...
- AC日记——[FJOI2007]轮状病毒 bzoj 1002
1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...
- BZOJ 1002 [ FJOI 2007 ]
-------------------------萌萌哒分割线------------------------- 题目很容易看懂,数据范围也不大.当然可以卡过暴力的人了. 在n=1时很明显是一种,如下 ...
随机推荐
- Python 爬虫三 beautifulsoup模块
beautifulsoup模块 BeautifulSoup模块 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查 ...
- 【Thymeleaf】Thymeleaf模板对html实时刷新
解决方案 spring: thymeleaf: cache: false 修改完html代码后Ctrl+Shift+F9,重新编译即可刷新页面内容!
- META-INF文件夹中的MANIFEST.MF 的作用
manifest文件是用来描述jar包的,它描述了该jar包的代码是谁的,什么版本,使用什么版本的类库等等....具体如下: 1.基础格式 manifest 文件的格式是很简单的,每一行都是 名-值 ...
- eclipse使用异常An error has occurred.see error log for more details eclipse
eclipse使用异常An error has occurred.see error log for more details eclipse 解决Eclipse,MyEclipse出现An erro ...
- OGG初始加载过程概述
您可以使用Oracle GoldenGate来: 执行独立的批量加载以填充数据库表以进行迁移或其他用途. 将数据作为初始同步运行的一部分加载到数据库表中,以准备与Oracle GoldenGate进行 ...
- C#如何操作XML文件
⒈XML? XML是一种可扩展的标记语言 具有以下特点 1.严格区分大小写 2.标签成对出现 3.有且只有一个根节点 ⒉XML的创建 <?xml version="1.0" ...
- DevExpress VCL 的 cxDBTreeList 的使用方法
DevExpress VCL 的 cxDBTreeList 的使用方法:(假设控件名为: WBSTree) 1.控件WBSTree 通过绑定 DataSet 获取数据记录(Nodes),通过 Col ...
- sublime修改侧边栏字体
安装了sublime的material主题后,侧边栏的字体特别小,设置方法如下: 安装插件 用上面的插件打开 Material-Theme.sublime-theme 如下 { "class ...
- T-SQL GROUP BY子句 分组查询
SQL Server GROUP BY子句与SELECT语句协作使用,以将相同的数据分组. GROUP BY子句位于SELECT语句中的WHERE子句之后,位于ORDER BY子句之前. 语法 以下是 ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...