BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 7125 Solved: 3878
[Submit][Status][Discuss]
Description
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
.png)
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
.png)
Input
第一行有1个正整数n
Output
计算出的不同的n轮状病毒数输出
Sample Input
Sample Output
HINT
题解:基尔霍夫矩阵(我也不知道是什么)推出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();}
BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)的更多相关文章
- bzoj1002: [FJOI2007]轮状病毒 生成树计数
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规 ...
- [bzoj1002][FJOI2007 轮状病毒] (生成树计数+递推+高精度)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- BZOJ1002 FJOI2007 轮状病毒 【基尔霍夫矩阵+高精度】
BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原 ...
- [bzoj1002][FJOI2007]轮状病毒_递推_高精度
轮状病毒 bzoj-1002 FJOI-2007 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2 ...
- bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)
1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵?? ...
- [BZOJ1002] [FJOI2007] 轮状病毒 (数学)
Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...
- [luogu2144][bzoj1002][FJOI2007]轮状病毒【高精度+斐波那契数列+基尔霍夫矩阵】
题目描述 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病 ...
- BZOJ1002[FJOI2007]轮状病毒
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
- BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
随机推荐
- 关于mysql驱动cj与不是cj的问题
1. 带cj的是mysql驱动6.0以上的,不带的是6.0以下的. 2.6.0以上的需要注意有时区纠正
- Python连接SqlServer+GUI嵌入式——学生管理系统1.0
学生管理系统1.0 1.建学生数据库 2.数据库嵌入高级语言(Python) 3.界面设计 简化思路: 1.先通过SqlServer2012建立学生数据库,包括账号.密码,姓名.选课等信息 2.运用P ...
- nyoj 27-水池数目(BFS, DFS)
27-水池数目 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 南阳理工学院校园里有一些小河和一些湖泊,现在,我 ...
- nyoj 39-水仙花数
39-水仙花数 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:35 submit:70 题目描述: 请判断一个数是不是水仙花数. 其中水仙花数定义各 ...
- Javascript脚本语言
找组件用 id (唯一) 2.name 样式 使用分类 1 页面中 2 建JS文件 可以放在head也可以在body 工作区可以有 1 全局变量 2 由多个函数构成 标签编辑器 onChange 改变 ...
- ASP.NET Core gRPC 使用 Consul 服务注册发现
一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...
- 2019-10-31:渗透测试,基础学习,mongodb注入学习
mongodb命令删除文档,db.集合名.remove({键:值})更新文档,db.集合名.update({被更新的对象},{$set:{要更新的内容}}),默认只更新检测到的第一条文档更新全部匹配到 ...
- 小白学 Python 爬虫(10):Session 和 Cookies
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- vue 中使用 watch 的各种问题
报错: Method "watch" has type "object" in the component definition. Did you refere ...
- linux命令之less命令
一.我查看日志特别喜欢用less命令来查看,下面给大家讲解下使用. less(选项)(参数) 选项如下: -e:文件内容显示完毕后,自动退出: -f:强制显示文件: -g:不加亮显示搜索到的所有关键词 ...