bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元
基本思路:
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 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元的更多相关文章
- bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2234 Solved: 1227[Submit][Statu ...
- BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5577 Solved: 3031[Submit][Statu ...
- BZOJ1002 FJOI2007 轮状病毒 【基尔霍夫矩阵+高精度】
BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原 ...
- bzoj 1002 找规律(基尔霍夫矩阵)
网上说的是什么基尔霍夫矩阵,没学过这个,打个表找下规律,发现 w[i]=3*w[i-1]-w[i-2]+2; 然后写个高精直接递推就行了 //By BLADEVIL var n :longint; a ...
- [bzoj1002] [FJOI2007]轮状病毒轮状病毒(基尔霍夫矩阵)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
- bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)
1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵?? ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...
- 无向图生成树计数 基尔霍夫矩阵 SPOJ Highways
基尔霍夫矩阵 https://blog.csdn.net/w4149/article/details/77387045 https://blog.csdn.net/qq_29963431/articl ...
随机推荐
- 各操作系统下php.ini文件的位置在哪里
这个问题虽然说很小,但是却还是经常会出现的问题,特别是刚入门php的同学更是如此.而这个问题呢,我也经常被问到,所以就在这里总结一下. 首先php.ini文件并不是隐藏文件,寻找php.ini文件的方 ...
- list_car()函数小记
一 ,list_car ,前端传过来参数字典,从字典中获取参数 二, 根据参数去数据库中查找,条件查找 三,将查找出来的对象,flask_sqlalchemy.BaseQuery,然后通过这个对象的 ...
- Charles抓取https
步骤一:将Charles的根证书(Charles Root Certificates)安装到Mac上. Help -> SSL Proxying -> Install Charles Ro ...
- scrapy--meta参数传递问题
scrapy使用大坑---meta参数传递出现之重复问题 问题描述: 爬虫目标: 实现哔哩哔哩网站的视频信息爬取,只要的信息结构爬去顺序为**关键词的搜索结果,拿到第一页上某个视频的标题,url,和时 ...
- 软件-JMeter:JMeter 百科
ylbtech-软件-JMeter:JMeter 百科 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到 ...
- leetcode 238. 除自身以外数组的乘积 (python)
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...
- time in china
https://www.timeanddate.com/worldclock/china
- Vagrant 手册之 box - 版本
原文地址 从 Vagrant 1.5 版本起,box 开始支持版本.这运行创建 box 的人提交更新,使用 box 的人检查更新.更新 box 并查看变更记录. 对于 Vagrant 新手,box 版 ...
- 16/7/8_PHP-书写规范 PHP Coding Standard
变量命名规范这里感觉 打算采用 匈牙利命名法+驼峰法命名,因为 PHP是弱类型语言,很多时间因为忽略了变量类型而导致犯一些低级错误.所以在前面加上类型名有助于更好的理解代码. 下载是转载 PHP书写规 ...
- hdu6228Tree
Problem Description Consider a un-rooted tree T which is not the biological significance of tree or ...