题目大意:轮状病毒基定义如图。求有多少n轮状病毒

这个递推实在是不会……所以我选择了打表找规律

首先执行下面程序

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 110
using namespace std;
struct abcd{
int to,next;
bool ban;
}table[M<<2];
int head[M],tot=1;
int n,ans;
void Add(int x,int y)
{
table[++tot].to=y;
table[tot].next=head[x];
head[x]=tot;
}
int fa[M],v[M],q[M],r,h;
bool BFS()
{
int i;
r=h=0;
memset(v,0,sizeof v);
memset(fa,-1,sizeof fa);
q[++r]=0;
while(r!=h)
{
int x=q[++h];
for(i=head[x];i;i=table[i].next)
if(!table[i].ban)
{
if(table[i].to==fa[x])
continue;
if(v[table[i].to])
return 0;
fa[table[i].to]=x;
v[table[i].to]=1;
q[++r]=table[i].to;
}
}
if(r<=n)
return 0;
return 1;
}
void DFS(int x)
{
if(x+x>tot)
{
if( BFS() )
++ans;
return ;
}
table[x<<1].ban=table[x<<1|1].ban=0;
DFS(x+1);
table[x<<1].ban=table[x<<1|1].ban=1;
DFS(x+1);
}
int main()
{
int i;
while(1)
{
memset(head,0,sizeof head);
tot=1;ans=0;
cin>>n;
for(i=1;i<=n;i++)
Add(0,i),Add(i,0),Add(i,i%n+1),Add(i%n+1,i);
DFS(1);
cout<<ans<<endl;
}
}

够简单。够暴力吧

然后打表。1~14的答案例如以下

1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 710645

奇数项

1 16 121 841 5776 39601 271441

开根号得

1 4 11 29 76 199 521

a[i]=a[i-1]*3-a[i-2]

偶数项

5 45 320 2205 15125 103680 710645

除以5得

1 9 64 441 3025 20736 142129

开根号得

1 3 8 21 55 144 377

a[i]=a[i-1]*3-a[i-2]

然后高精度递推即可了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct abcd{
int x[100],cnt;
int& operator [] (int y)
{
return x[y];
}
void operator = (int y)
{
x[1]=y;
cnt=1;
}
}f[100];
abcd operator - (abcd x,abcd &y)
{
int i;
abcd z=f[0];
z.cnt=max(x.cnt,y.cnt);
for(i=1;i<=z.cnt;i++)
{
z[i]+=x[i]-y[i];
if(z[i]<0)
z[i+1]--,z[i]+=10;
}
while(z.cnt&&!z[z.cnt])
z.cnt--;
return z;
}
abcd operator * (abcd &x,abcd &y)
{
int i,j;
abcd z=f[0];
for(i=1;i<=x.cnt;i++)
for(j=1;j<=y.cnt;j++)
z[i+j-1]+=x[i]*y[j],z[i+j]+=z[i+j-1]/10,z[i+j-1]%=10;
z.cnt=x.cnt+y.cnt;
if(!z[z.cnt])
--z.cnt;
return z;
}
abcd operator * (abcd x,int y)
{
int i;
abcd z=f[0];
for(i=1;i<=x.cnt;i++)
z[i]+=x[i]*y,z[i+1]+=z[i]/10,z[i]%=10;
z.cnt=x.cnt;
if(z[z.cnt+1])
++z.cnt;
return z;
}
ostream& operator << (ostream &os,abcd x)
{
int i;
for(i=x.cnt;i;i--)
os<<x[i];
return os;
}
int n;
int main()
{
int i;
cin>>n;
f[1]=1;
f[2]=n&1?4:3;
for(i=3;i+i<=n+1;i++)
f[i]=f[i-1]*3-f[i-2];
cout<<f[n+1>>1]*f[n+1>>1]*(n&1?1:5)<<endl;
}

BZOJ 1002 FJOI2007 轮状病毒 递推+高精度的更多相关文章

  1. 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度

    1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...

  2. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

    Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...

  3. bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵

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

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

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

  5. BZOJ 1002 [FJOI2007]轮状病毒

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

  6. 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒

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

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

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

  8. bzoj 1002 [FJOI2007]轮状病毒——打表找规律

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...

  9. 1002: [FJOI2007]轮状病毒

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

随机推荐

  1. CentOS下VNC使用

    1. 介绍 本文主要介绍了VNC Server的配置和使用 2. 安装 CentOS中默认就有安装VNC,可以通过命令rpm查看 [Jerry@localhost ~]$ rpm -qa | grep ...

  2. 修改手機的 input source 及 charger 及 usb 相關電路後,容易忽略的事項

    input source 及 charger 需要注意, 是否可以在關機的狀況下充電, 當然 開機充電 是一定要的. usb 部分需要注意, 是否可以在沒有電或者是有電的狀況下 download 程式 ...

  3. LeetCode OJ--Palindrome Partitioning **

    https://oj.leetcode.com/problems/palindrome-partitioning/ 给定一个字符串 s,求所有的子串组合,每个子串都是回文的. 比如,aba: {a,b ...

  4. php基础 gd图像生成、缩放、logo水印和验证码

    gd库是php最常用的图片处理库之一(另外一个是imagemagick),可以生成图片.验证码.水印.缩略图等等. 图像生成 <?php /* 用windows画图板画图 1.新建空白画布(指定 ...

  5. apache url rewrite问题

    apache RewriteEngine Your browser sent a request that this server could not understand http://www.ra ...

  6. PHP实现RabbitMQ的Publish/Subscribe

    <?php /** * Created by PhpStorm. * User: 豆腐居士 * Date: 2018/5/30 * Time: 上午11:01 */ class AqiTask ...

  7. EasyMvc入门教程-基本控件说明(13)选项卡导航

    选项卡Tab导航主要用于企业页面显示不同子类或者子页面的信息内容. 先来一个基本的使用例子:代码如下: @{ var data = new List<TabItem>() { new Ta ...

  8. Windows脚本\批处理命令学习笔记

    1.为新建变量赋值: set 变量=值 2.输出变量的值 echo %变量% 3.关闭批处理中命令行的显示(默认是显示命令行的) 在文件開始处增加:echo off 若需又一次显示:echo on 若 ...

  9. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  10. 如何查看linux版本 如何查看LINUX是多少位

    一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux ...