基本思路:

1.先观察规律,写写画画未果

2.写程序暴力打表找规律,找出规律

1-15的答案:1        5        16        45        121

      320    841       2205      5776     15125

      39601    103680    271441     710645       1860496

第1、3、5、7...[奇数位]位是平方数 :

  1*1  4*4  11*11   29*29   76*76   199*199  521*521...

第2、4、6、8...[偶数位]位除以5后也是平方数:

  5*1*1  5*3*3  5*8*8  5*21*21  5*55*55   5*144*144 ...

奇数位:1  3  4  7  11  18  29  47  76...

偶数位:1  2  3  5  8   13  21  34  55...

这个跟一般的斐波那契数列的不同在于初始两个数的值不同以及间隔呈现斐波那契数列的规律

所以求解的时候可以分开来求,也可以整个一块求,整合起来就是F(n)=  3*F(n-1)-  F(n+2)+  2

至于最终的公式是怎么求出来的,我不会,但是有个网站,这上面你可以放有规律数列的前几项,它可以找出规律  https://www.wolframalpha.com/

3.正解是基尔霍夫矩阵,一种无相图转化为方阵并求出生成树个数的定理

证明我还没研究过,最近真的没什么时间,以后补上~

简单介绍下基尔霍夫矩阵:

  • 对于一个无向图 G ,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝对值。
  • 所谓的N-1阶主子式就是对于一个任意的一个 r ,将矩阵的第 r 行和第 r 列同时删去得到的新矩阵。
  • 基尔霍夫Kirchhoff矩阵的一种求法:基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接矩阵 A,所以这个行列式的值可以用Gauss转换为三角行列式求值即可O(n^3)
  • 度数矩阵D:是一个 N×N 的矩阵,其中

    D[i][j]=0(i≠j)D[i][j]=0(i≠j),D[i][i]=i号点的度数D[i][i]=i号点的度数

  • 邻接矩阵A:是一个 N×N 的矩阵,其中

    A[i][i]=0,A[i][j]=A[j][i]=i,j之间的边数A[i][i]=0,A[i][j]=A[j][i]=i,j之间的边数

  • 然后基尔霍夫Kirchhoff矩阵K=D-A

代码如下:

//暴力代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<set> using namespace std; typedef long long ll;
typedef long long LL;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const int maxn = 200+10;
const ll mod = 1e9+9;
int ans,cnt,n;
int head[maxn],fa[maxn],vis[maxn];
struct Table{
int to,next;
bool ban;
}table[maxn<<2];
void add(int x,int y){
table[cnt].to=y;
table[cnt].next=head[x];
head[x]=cnt++;
}
bool bfs()
{
memset(fa,-1,sizeof(fa));
memset(vis,0,sizeof(vis));
queue<int>q;q.push(0);vis[0]=true;int tot=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i!=-1;i=table[i].next){
if(!table[i].ban){
int v=table[i].to;
if(v==fa[u]) continue;
if(vis[v]) return 0;
fa[v]=u;
vis[v]=1;
q.push(v);
tot++;
}
}
}
if(tot<=n) return 0;
else return 1;
}
void dfs(int x){
if((x<<1)>=cnt){
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 num;
scanf("%d",&num);
for(int i=1;i<=num;i++){
ans=0;cnt=0;n=i;
memset(head,-1,sizeof(head));
for(int j=1;j<=i;j++){
add(0,j);add(j,0);add(j,j%n+1);add(j%n+1,j);
}
dfs(0);
cout<<ans<<" ";
}
return 0;
}
//大数规律代码
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 100+10; struct BigInteger{
int arr[maxn];
int len;
BigInteger(){
memset(arr,0,sizeof(arr));
len=0;
}
};
BigInteger Mul(BigInteger a,int k){
for(int i=1;i<=a.len;i++){
a.arr[i]*=k;
}
for(int i=1;i<=a.len;i++){
a.arr[i+1]+=a.arr[i]/10;
a.arr[i]%=10;
}
if(a.arr[a.len+1]!=0) a.len++;
return a;
}
BigInteger Sub(BigInteger a,BigInteger b){
a.arr[1]+=2;
int j=1;
while(a.arr[j]>=10){
a.arr[j+1]++;
a.arr[j]%=10;
j++;
}
//!!!
a.len=max(a.len,j);
for(int i=1;i<=a.len;i++){
a.arr[i]-=b.arr[i];
if(a.arr[i]<0){
a.arr[i]+=10;
a.arr[i+1]--;
}
}
while(a.arr[a.len]==0) a.len--;
return a;
}
int main(){
BigInteger f[maxn];
f[1].arr[1]=1;f[1].len=1;
f[2].arr[1]=5;f[2].len=1;
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++){
f[i]=Sub(Mul(f[i-1],3),f[i-2]);
}
for(int i=f[n].len;i>0;i--){
printf("%d",f[n].arr[i]);
}
printf("\n");
return 0;
}

  

bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

    基尔霍夫矩阵 https://blog.csdn.net/w4149/article/details/77387045 https://blog.csdn.net/qq_29963431/articl ...

随机推荐

  1. DAO层单元测试编码和问题排查

    DAO层单元测试编码和问题排查 SecKillDaoTest .java(注意接口参数使用注解@Parm(“parameter”)) package org.secKill.dao; import o ...

  2. [CSP-S模拟测试94]题解

    A.凉宫春日的忧郁 高精硬上似乎跑不过,其实可以都取个$log$.那么只需要比较$y\times log ^x$和$\sum \limits _{i=1}^y log^i$就好了. #include& ...

  3. web storm查看文件结构

    菜单栏Navigate -> File Structure https://www.jetbrains.com/help/webstorm/viewing-structure-of-a-sour ...

  4. JS-关闭当前窗口

    不提示直接关闭 默认有提示,若希望不提示直接关闭则需要使用(并非兼容全部浏览器) window.opener=null; window.open('','_self'); window.close() ...

  5. leetcode 235. 二叉搜索树的最近公共祖先(c++)

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...

  6. Java常用工具——java异常

    package com.imooc.exception; import java.util.Scanner; public class TryCatchDemo1 { public static vo ...

  7. linux使用apache发布静态html网页

    环境 centOS7+httpd 安装httpd 安装 #检查是否安装和httpd rpm -qa | grep httpd #如果没安装 yum -y install httpd 启动httpd并验 ...

  8. Tomcat服务器时间不正确

    ================================1=============================== 增加Tomcat参数设置"-Duser.timezone=G ...

  9. 测开之路七十四:python处理kafka

    kafka-python地址:https://github.com/dpkp/kafka-python 安装kafka-python:pip install kafka-python 接收消息 fro ...

  10. excel wps access mysql数据表格的查询之路

    简直血崩,最近去做兼职,每天都有大量的表格数据要整理. 开始 还是 用 excel的用起来还算顺畅,慢慢慢慢的发现了各种弊端.大概类似于分组排序什么什么的好多啦~~~不过也确实是用了不到两个小时就能比 ...