1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2234  Solved: 1227
[Submit][Status]

Description

给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input

第一行有1个正整数n。

Output

将编程计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

HINT

Source

基尔霍夫矩阵总算编出来了,这道题考察的就是数列找规律,要善于联系斐波那契等数列,完全平方数列,奇偶项分别探究。

另外,终于知道c++中四射五入时roundf(float) round(double) roundl(long double)

这道题真在考场上估计是想不出来,主要是因为数列前两项与基尔霍夫矩阵求出的不同,就老是有求错的心理压力。

高精度模板有较小的改动

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
#define eps 1e-7
#define MAXN 111
#ifdef unix120G
#define LL "%lld"
#else
#define LL "%I64d"
#endif
/*
1
5=5*1*1
16=4*4
45=5*3*3
121=11*11
320=5*8*8
841=29*29
2205=5*21*21
5776=76*76
15125
39601
103680
271441
710645
1860496
4870845
12752041
*/
typedef long double real;
typedef long long qword;
int n,m,mod;
int a[MAXN][MAXN];
typedef int arr_t[MAXN][MAXN];
real b[MAXN][MAXN];
void pm()
{
int i,j;
cout<<endl;
for (i=;i<n;i++)
{
for (j=;j<n;j++)
{
cout<<b[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
return ;
}
int gauss(arr_t a,int n)
{
int i,j,k,sign,x;
for (i=;i<n;i++)
{
for (j=;j<n;j++)
{
b[i][j]=a[i][j];
}
}
real temp,ans=;
for (i=;i<n;i++)
{
if (abs(b[i][i])<eps)
{
for (j=i+;j<n;j++)
{
if (abs(b[j][i])>eps)
break;
}
if (j==n)return ;
x=j;
for (j=;j<n;j++)
{
swap(b[x][j],b[i][j]);
}
}
ans*=b[i][i];
for (j=i+;j<n;j++)
{
b[i][j]/=b[i][i];
}
for (j=i+;j<n;j++)
{
for (k=i+;k<n;k++)
{
b[j][k]-=b[i][k]*b[j][i];
}
}
// pm();
}
return (int)roundl(ans);
} qword work1()
{
int i,j,k;
memset(a,,sizeof(a));
for (i=;i<n;i++)
{
a[i][(i+)%n]=a[(i+)%n][i]=-;
a[n][i]=a[i][n]=-;
}
for (i=;i<n;i++)a[i][i]=;
a[n][n]=n;
cout<<gauss(a,n)<<endl;;
}
#define MAXL 10000
#define VAL1 10000
class number//四位
{
public:
number()
{
clear();
}
bool is_odd()
{
return numb[]%==;
}
bool is_even()
{
return numb[]%==;
}
void lsh_bin()
{
int i;
for (i=topn;i>;i--)
{
if (numb[i]%==)
{
numb[i-]+=VAL1;
}
numb[i]/=;
}
numb[]/=;
while (topn&&!numb[topn])topn--;
}
bool equal_to(int x)
{
if (topn==)
{
return x==numb[];
}
if (topn==)
{
return x==numb[]+numb[]*VAL1;
}
return false;
}
int size()
{
return topn;
}
int length()
{
int x=numb[topn];
int ret=;
while (x)
{
ret++;
x/=;
}
int y=;
x=VAL1;
while (x)
{
y++;
x/=;
}
y--;
ret+=topn*y;
return ret;
}
void operator =(int x)//{{{
{
int now=;
clear();
numb[now]=x;
while (numb[now]>=VAL1)
{
numb[now+]+=numb[now]/VAL1;
numb[now]%=VAL1;
now++;
if (now>topn)topn=now;
}
}//}}}
void operator =(number num)//{{{
{
topn=num.topn;
memcpy((this->numb),num.numb,sizeof(num.numb[])*(topn+));
}//}}}
void operator +=(number &num)//{{{
{
int i;
topn=max(topn,num.topn);
for (i=;i<=topn;i++)
{
numb[i]+=num.numb[i];;
if (numb[i]>=VAL1)
{
numb[i+]+=numb[i]/VAL1;
numb[i]%=VAL1;
}
}
while (numb[topn+])
{
topn++;
numb[topn+]+=numb[topn]/VAL1;
numb[topn]%=VAL1;
}
}//}}}
void operator +=(int x)//{{{
{
int now=;
if (topn==-)topn=;
numb[now]+=x;
while (numb[now]>=VAL1)
{
numb[now+]+=numb[now]/VAL1;
numb[now]%=VAL1;
now++;
if (now>topn)topn=now;
}
}//}}}
void operator *=(int x)//{{{
{
int i;
for (i=;i<=topn;i++)
{
numb[i]*=x;
}
for (i=;i<=topn;i++)
{
if (numb[i]>=VAL1)
{
numb[i+]+=numb[i]/VAL1;
numb[i]%=VAL1;
}
}
while (numb[topn+])
{
topn++;
numb[topn+]+=numb[topn]/VAL1;
numb[topn]%=VAL1;
}
}//}}}
void operator -=(number &num)//{{{
{
if (*this<num)throw "Error!\n->void operator -=(number &num)\n";
int i;
for (i=;i<=topn;i++)
{
numb[i]-=num.numb[i];
}
for (i=;i<=topn;i++)
{
while (numb[i]<)
{
numb[i]+=VAL1;
numb[i+]--;
}
}
while (topn&&!numb[topn])topn--;
}//}}}
void operator --(int)//{{{
{
if (topn==&&numb[]==)throw "Error!\n->void operator --(int)\n";
int now=;
numb[now]--;
while (numb[now]<)
{
numb[now+]--;
numb[now]+=VAL1;
}
while (topn&&!numb[topn])topn--;
}//}}}
private:
int numb[MAXL];
int topn;
void clear()
{
topn=;
memset(numb,,sizeof(numb)); }
friend bool operator <(number num1,number num2);
friend bool operator <=(number num1,number num2);
friend bool operator ==(number num1,number num2);
friend ostream& operator <<(ostream &out,number &num);
friend istream& operator >>(istream &in,number &num);
friend number operator *(number &num1,number &num2);
friend number operator *(number num,int x);
friend number operator +(number num1,number num2);
friend number operator +(number num1,int x);
friend number operator -(number num1,number num2);
//a=a+b远没有a+=b快
};
bool operator <(number num1,number num2)//{{{
{
if (num1.topn!=num2.topn)
{
return num1.topn<num2.topn;
}
int i;
for (i=num1.topn;i>=;i--)
{
if (num1.numb[i]!=num2.numb[i])
{
return num1.numb[i]<num2.numb[i];
}
}
return false;
}//}}}
bool operator <=(number num1,number num2)//{{{
{
if (num1.topn!=num2.topn)
{
return num1.topn<num2.topn;
}
int i;
for (i=num1.topn;i>=;i--)
{
if (num1.numb[i]!=num2.numb[i])
{
return num1.numb[i]<num2.numb[i];
}
}
return true;
}//}}}
bool operator ==(number num1,number num2)//{{{
{
if (num1.topn!=num2.topn)return false;
for (int i=;i<=num1.topn;i++)
{
if (num1.numb[i]!=num2.numb[i])return false;
}
return true;
}//}}}
ostream& operator <<(ostream &out,number &num)//{{{
{
int i;
out<<num.numb[num.topn];
for (i=num.topn-;i>=;i--)
{
//压六位时
// if (num.numb[i]<100000)out<<"0";
// if (num.numb[i]<10000)out<<"0";
if (num.numb[i]<)out<<"";
if (num.numb[i]<)out<<"";
if (num.numb[i]<)out<<"";
out<<num.numb[i];
}
return out;
}//}}}
istream& operator >>(istream &in,number &num)//{{{
{
string str;
in>>str;
int i;
num.clear();
for (i=(int)str.length()-,num.topn=;i>=;i-=,num.topn++)
{
if (i-<str.length())
{
num.numb[num.topn]=(str[i]-'')+*(str[i-]-'')+*(str[i-]-'')+*(str[i-]-'');
}else
{
if (i-<str.length())num.numb[num.topn]+=*(str[i-]-'');
if (i-<str.length())num.numb[num.topn]+=*(str[i-]-'');
if (i <str.length())num.numb[num.topn]+=(str[i]-'');
}
}
num.topn--;
return in;
}//}}}
number operator *(number num,int x)//{{{
{
number ret;
ret=num;
ret*=x;
return ret;
}//}}}
number operator +(number num1,number num2)//{{{
{
number ret;
ret=num1;
ret+=num2;
return ret;
}//}}}
number operator +(number num1,int x)//{{{
{
number ret;
ret=num1;
ret+=x;
return ret;
}//}}}
number operator -(number num1,number num2)//{{{
{
number ret;
ret=num1;
ret-=num2;
return ret;
}//}}
number f[];
int main()
{
freopen("input.txt","r",stdin);
//freopen(PROB".out","w",stdout);
int x,y;
int i,j,k;
scanf("%d",&n);
if (n==)
{
printf("1\n");
return ;
}
if (n==)
{
printf("5\n");
return ;
}
f[]=;f[]=;
for (i=;i<=n;i++)
f[i]=f[i-]*-f[i-]+;
//for (i=1;i<=n;i++)cout<<f[i]<<endl;
cout<<f[n]<<endl;
return ;
}

bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵的更多相关文章

  1. bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元

    基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 151 ...

  2. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

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

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

  4. bzoj 1002 找规律(基尔霍夫矩阵)

    网上说的是什么基尔霍夫矩阵,没学过这个,打个表找下规律,发现 w[i]=3*w[i-1]-w[i-2]+2; 然后写个高精直接递推就行了 //By BLADEVIL var n :longint; a ...

  5. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  6. BZOJ 1002 [FJOI2007]轮状病毒

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

  7. BZOJ1002 FJOI2007 轮状病毒 【基尔霍夫矩阵+高精度】

    BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原 ...

  8. 【刷题】BZOJ 1002 [FJOI2007]轮状病毒

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  9. bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)

    1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵?? ...

随机推荐

  1. ATL 工程下添加右击菜单

    首先在dllmain.cpp中添加如下声明 HINSTANCE g_hInstance;  g_hInstance = hInstance; 源码如下: CPoint point;  ::GetCur ...

  2. linux+apache+mod_Jk+tomcat实现tomcat集群

    最近一段时间一直在研究实现apache + jk_mod + tomcat实现负载均衡,起初负载均衡算是配置蛮顺利的,但是到了配置tomcat集群时所有配置都没有问题,但是tomcat日志中一直提示没 ...

  3. ASP.NET中常用方法

    身份证号检测: /// <summary> /// 检验身份证号是否正确 /// </summary> /// <param name="Id"> ...

  4. Orcle数据库恢复

    不知道什么原因,服务器上的数据库报错:ORA-01033:ORACLE initialization or shutdown in progress 首先检查:监听文件的主机名及端口号是否更改 数据文 ...

  5. 百度知道的php爬虫

    原文地址:百度知道的php爬虫作者:好宏杰软件 <?php class spider  {    private $content ;    private $contentlen ;    p ...

  6. DedeCMS文章标题前增加所属栏目名称链接

    问题描述:在调用文章标题的时候,我想实现这样的形式:“[国内新闻]站长无忧真的是一个不错的站”,其中“国内新闻”是标题的所属栏目,并且加链接:    解决方法: [field:typelink /]这 ...

  7. Java SE (3) 之 事件监听

    package com.sun; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Demo ...

  8. Spring Framework jar官方直接下载路径

    SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...

  9. Java:Date、Calendar、Timestamp的使用

    一.Java.util.Date 该对象包含了年月日时分秒信息.具体使用如下代码: //String 转换为Date private static void dateDemo() throws Par ...

  10. Mybatis的学习总结:mybatis的入门介绍

    一.myBatis简述 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...