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项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...
- Referenced file contains errors (http://tiles.apache.org/dtds/tiles-config_3_0.dtd)
java开发时遇到的问题,之前还是好好的,没有错误提示.可是今天一打开项目就出现这种问题.真不知道是怎么回事,在这里求助.错误如下: Referenced file contains errors ( ...
- 怎样找Android里自带的数据库?
首先先让它显示出来. 窗口window下的Show View 下的File Explorer(other里), 这时File Explorer窗口 就会显示出来,下一步我们找到data下的data,然 ...
- 2015 UESTC Training for Search Algorithm & String - J - 全都是秋实大哥 【KMP】
给出一个字符串,求每个前缀的最小循环节长度,并输出整个字符串的最小循环节.字符串长度为3*10^6 找循环节这种问题还是要用KMP对于长度为i的字符串 i%(i-f[i])==0 此时,它的最小循环节 ...
- noip 2012 疫情控制
/* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...
- php5.2通过saprfc扩展远程连接sap730成功案例
公司刚上sap系统,由于资金有限,sap与其它系统的数据交换需要公司内部实现.于是,领导决定入库申请流程需要在sap与OA系统里实现电子签核流,重担果然落到我的身上.好在我只负责OA,还一位同事负责s ...
- javaee后台适合用的编辑器插件
http://pan.baidu.com/s/1bn7D9sr 这个适合用在后台
- #BeginLibraryItem 的疑问...
<!-- #BeginLibraryItem "/library/ur_here.lbi" --><div style="padding:3px 15p ...
- 黑马程序员-for和foreach
class Program { static void Main(string[] args) { Console.WriteLine("***第一种情况****************** ...
- tomcat报404
很久没有用eclipse了,尝试了使用下,竟然将简单的配置tomcat都忘了. 自己新建一个工程,在tomcat发布以后,报404,经查Serves下的web.xml中,欢迎页面是index.jsp, ...