BZOJ 1002 [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 3106 Solved: 1724
[Submit][Status][Discuss]
Description
给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input
第一行有1个正整数n。
Output
将编程计算出的不同的n轮状病毒数输出
Sample Input
Sample Output
HINT
Source
题解:貌似考的是基尔霍夫矩阵(<-什么破玩意?)
算法引入:
给定一个无向图G,求它生成树的个数t(G);
算法思想:
(1)G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数;
(2)G的邻接矩阵A[G]是一个n*n的矩阵,并且满足:如果vi,vj之间有边直接相连,则aij=1,否则为0;
定义图G的Kirchhoff矩阵C[G]为C[G]=D[G]-A[G];
*Matrix-Tree定理:G的所有不同的生成树的个数等于其Kirchhoff矩阵C[G]任何一个n-1阶主子式的行列式的绝对值;
所谓n-1阶主子式,就是对于r(1≤r≤n),将C[G]的第r行,第r列同时去掉后得到的新矩阵,用Cr[G]表示;
*Kirchhoff矩阵的特殊性质:
(1)对于任何一个图G,它的Kirchhoff矩阵C的行列式总是0,这是因为C每行每列所有元素的和均为0;
(2)如果G是不连通的,则它的Kirchhoff矩阵C的任一个主子式的行列式均为0;
(3)如果G是一颗树,那么它的Kirchhoff矩阵C的任一个n-1阶主子式的行列式均为1;
扯了这么多,其实这道题根本用不上,只要知道这玩意能推出f[i]=(f[i-1]*3-f[i-2]+2)就行了。注意高精度。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define eps 1e-8
using namespace std;
const int maxn=;
struct bign{
int len,s[maxn];
bign(){memset(s,,sizeof(s));len=;}
bign(int num){*this=num;}
bign(const char *num){*this=num;}
bign operator = (const int num){
char s[maxn]; sprintf(s,"%d",num);
*this = s;return *this;
}
bign operator = (const char *num){
for(int i=;num[i]=='';num++);
len=strlen(num);
for(int i=;i<len;i++) s[i]=num[len-i-]-'';
return *this;
}
bign operator + (const bign &b) const{
bign c;c.len=;
for(int i=,g=;g||i<max(len,b.len);i++) {
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%;
g=x/;
} return c;
}
void clean(){while(len > && !s[len-]) len--;return;}
bign operator * (const bign &b){
bign c;
c.len=len+b.len;
for(int i=;i<len;i++) for(int j=;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
for(int i=;i<c.len;i++){
c.s[i+]+=c.s[i]/;
c.s[i]%=;
} c.clean();return c;
}
bign operator - (const bign &b){
bign c;c.len=;
for(int i=,g=;i<len;i++){
int x=s[i]-g;if(i<b.len) x-=b.s[i];
if(x>=) g=;
else g=,x+=;
c.s[c.len++]=x;
} c.clean();return c;
}
bign operator / (const bign &b) {
bign c,f=;
for(int i=len-;i>=;i--){
f=f*;f.s[]=s[i];
while(!(f<b)) f=f-b,c.s[i]++;
} c.len=len;c.clean();return c;
}
bign operator % (const bign &b) {
bign r = *this / b;
r = *this - r*b;
return r;
}
bool operator < (const bign &b) {
if(len!=b.len) return len<b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]<b.s[i];
} return false;
}
bool operator > (const bign &b){
if(len!=b.len) return len>b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]>b.s[i];
} return false;
}
bool operator == (const bign &b){
return !(*this>b)&&!(*this<b);
}
bool operator >= (const bign &b){
return (*this>b)||(*this==b);
}
void print(){
for(int i=len-;i>=;i--) putchar(s[i]+'');return;
}
}f[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n;
void init(){
n=read();f[]=;f[]=;
return;
}
void work(){
for(int i=;i<=n;i++) f[i]=f[i-]*-f[i-]+;
return;
}
void print(){
f[n].print();
return;
}
int main(){init();work();print();}
然后窝萌来打表好辣~
打表代码生成器:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define eps 1e-8
using namespace std;
const int maxn=;
struct bign{
int len,s[maxn];
bign(){memset(s,,sizeof(s));len=;}
bign(int num){*this=num;}
bign(const char *num){*this=num;}
bign operator = (const int num){
char s[maxn]; sprintf(s,"%d",num);
*this = s;return *this;
}
bign operator = (const char *num){
for(int i=;num[i]=='';num++);
len=strlen(num);
for(int i=;i<len;i++) s[i]=num[len-i-]-'';
return *this;
}
bign operator + (const bign &b) const{
bign c;c.len=;
for(int i=,g=;g||i<max(len,b.len);i++) {
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%;
g=x/;
} return c;
}
void clean(){while(len > && !s[len-]) len--;return;}
bign operator * (const bign &b){
bign c;
c.len=len+b.len;
for(int i=;i<len;i++) for(int j=;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
for(int i=;i<c.len;i++){
c.s[i+]+=c.s[i]/;
c.s[i]%=;
} c.clean();return c;
}
bign operator - (const bign &b){
bign c;c.len=;
for(int i=,g=;i<len;i++){
int x=s[i]-g;if(i<b.len) x-=b.s[i];
if(x>=) g=;
else g=,x+=;
c.s[c.len++]=x;
} c.clean();return c;
}
bign operator / (const bign &b) {
bign c,f=;
for(int i=len-;i>=;i--){
f=f*;f.s[]=s[i];
while(!(f<b)) f=f-b,c.s[i]++;
} c.len=len;c.clean();return c;
}
bign operator % (const bign &b) {
bign r = *this / b;
r = *this - r*b;
return r;
}
bool operator < (const bign &b) {
if(len!=b.len) return len<b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]<b.s[i];
} return false;
}
bool operator > (const bign &b){
if(len!=b.len) return len>b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]>b.s[i];
} return false;
}
bool operator == (const bign &b){
return !(*this>b)&&!(*this<b);
}
bool operator >= (const bign &b){
return (*this>b)||(*this==b);
}
void print(){
for(int i=len-;i>=;i--) putchar(s[i]+'');return;
}
}f[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n;
void init(){
f[]=;f[]=;
return;
}
void work(){
for(int i=;i<=;i++) f[i]=f[i-]*-f[i-]+;
return;
}
void print(){
freopen("dabiao.txt","w",stdout);
puts("if(n==1)puts(\"1\");");
for(int i=;i<=;i++){
printf("else if(n==%d)puts(\"",i);f[i].print();puts("\");");
}
return;
}
int main(){init();work();print();}
打表代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n;
void init(){
n=read();
if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
else if(n==)puts("");
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
BZOJ 1002 [FJOI2007]轮状病毒的更多相关文章
- bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2234 Solved: 1227[Submit][Statu ...
- 生成树的计数(基尔霍夫矩阵):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: 5577 Solved: 3031[Submit][Statu ...
- bzoj 1002 [FJOI2007]轮状病毒——打表找规律
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...
- 【刷题】BZOJ 1002 [FJOI2007]轮状病毒
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
- BZOJ 1002 FJOI2007 轮状病毒 递推+高精度
题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring& ...
- 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...
- 1002: [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2609 Solved: 1450[Submit][Statu ...
- 【BZOJ】1002: [FJOI2007]轮状病毒(DP+规律+高精度)
http://www.lydsy.com/JudgeOnline/problem.php?id=1002 其实我还是看题解的,而且看了题解也没明白那公式怎么来的T_T,先水过了先把....以后研究一下 ...
随机推荐
- Android Dialog透明度和暗度
1.设置透明度(Dialog自身的透明度)WindowManager.LayoutParams lp=dialog.getWindow().getAttributes(); lp.alpha=1.0f ...
- poj2586 Y2K Accounting Bug(贪心)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2586 ------ ...
- Android自己定义控件之应用程序首页轮播图
如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...
- mui.pushToRefresh组件下拉回调函数中this指向问题
先看一段代码 (function($) { //阻尼系数 var deceleration = mui.os.ios ? 0.003 : 0.0009; $('.mui-scroll-wrapper' ...
- dede织梦后台页面及功能修改及精简操作方法
先让我们来看看都有哪些页面控制着后台的功能和显示.下方为系统默认的后台界面图,为了便于下面的说明我对各个部分进行了一些标示.共A.B.C.D.E五个区域. 常用:A区域[顶部LOGO行]对应文件:/d ...
- CentOS6.6x86_64 部署 Nginx1.62+MySQL5.6.20+PHP5.6.4
准备工作 切换到管理员身份 su - 安装编译扩展 yum install -y gcc-c++ 创建数据库目录.代码目录 mkdir /mnt/data /mnt/www 安装Nginx 1.6.2 ...
- 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法
-----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...
- OC - 16.大文件下载
大文件下载注意事项 若不对下载的文件进行转存,会造成内存消耗急剧升高,甚至耗尽内存资源,造成程序终止. 在文件下载过程中通常会出现中途停止的状况,若不做处理,就要重新开始下载,浪费流量. 大文件下载的 ...
- Linux网络配置命令ifconfig输出信息解析
eth0 Link encap:Ethernet HWaddr 00:1e:4f:e9:c2:84 inet addr:128.224.163.153 Bcast:128.224.163 ...
- CAS 4.0 配置开发手册(转)
转:http://blog.csdn.net/ahpo/article/details/46412859 1 下载 地址http://downloads.jasig.org/ cas-serve ...