基本思路:

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. [CF1166C]A Tale of Two Lands题解

    比赛的时候lowerbound用错了 现场WA on test4(好吧我承认我那份代码确实有除了lowerbound以外的问题) 于是只能手动二分 (我好菜啊QAQ 经过一波数学推算,我们发现,设序列 ...

  2. dos编辑文件上传到unix系统多余^M删除方法

    linux上的文件sz到window编辑后多出^M, 方法一: 1.grep -anR '^M' filename |wc -l2.crontab -e 或vim filename3.:set ff  ...

  3. pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决

    最近正在迭代开发的一个项目编译安装时出现报“package com.sun.crypto.provider does not exist”的错误,由于本人能力水平有限,也是第一次遇到该问题,来来回回折 ...

  4. custom serializer for just one property in Json.NET

    Json序列化的时候跳过加密字段 字段类定义如下 public class Field { public bool IsEncrypted { get; set; } public string Na ...

  5. 在Mac OS X 10.11 EI Capitan 中提取iso镜像

    到Apple store上下载最新的OS X El Capitan ,下载完成后就可以进行iso镜像提取操作了. 步骤一:挂载El Capitan 的安装镜像文件 1 hdiutil attach / ...

  6. JS - 迭代协议

    Iteration protocols | MDN 可迭代协议(iterable protocol) 迭代器协议(iterator protocol)

  7. EL表达式(二)运算符

    运算符"."和"[]": "."能做的"[]"也能做,"[]"能做的"."不一定 ...

  8. HTML--JS 表单验证

    <html> <head> <title>验证表单</title> <script type="text/javascript" ...

  9. TCP 为什么是三次握手,而不是两次或四次?

    记得第一次看TCP握手连接的时候,有同样的疑问,我的疑问是,为何不是两次呢?后来随着对网络的理解深入,明白TCP报文是交由IP网络来负责运输,IP网络并不能保证TCP报文到达目的地,既然IP网络是指望 ...

  10. c++内存布局与c程序的内存布局

    c/c++的内存布局:堆,栈,自由存储区(与堆的区别),全局/静态存储区,常量存储区(字符串常量,const常量) http://www.cnblogs.com/QG-whz/p/5060894.ht ...