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 ...
随机推荐
- Oracle DB 查看预警日志
“Database(数据库)”主页>“Related Links相关链接)”区域> “Alert Log Content (预警日志内容)” 查看预警日志每个数据库都有一个alert_&l ...
- STM32之光敏电阻传感器模块的使用
本实验配合2.2寸TFT液晶屏显示,当光弱的时候显示“昏暗”,光强时显示“明亮”. 实验使用的是下图所示的3线光敏电阻传感器模块,用途:光线亮度检测,光线亮度传感器,智能小车寻光模块.模块特色:比较器 ...
- python判断字符串是否是json格式方法分享
python判断字符串是否是json格式方法分享 在实际工作中,有时候需要对判断字符串是否为合法的json格式 解决方法使用json.loads,这样更加符合'Pythonic'写法 代码示例: ...
- 非典型T_SQL的总结
------over的两种常用的用法--- --第一种分组 当然要注意了,这里的分组并不是实际的分组,而是根据你的业务需求而坐的临时分组 select roomguid,Room, avg(t ...
- Vue作用域插槽:基本用法
一 项目结构 二 App组件 <template> <div id="app"> <!-- 子组件 --> <user v-slot:de ...
- 简单入门爬斗鱼颜值区妹子照片 v1.1
这是个比较简单的入门爬虫.基于python3. urllib,urllib2,python3中用urllib.request代替,使用方法基本一致. #python3 import urllib.re ...
- jdk (Java Development Kit)
JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具. JD ...
- Win7 64位注册32位DLL
记忆力越来越差,备忘. 参考地址 https://support.microsoft.com/en-us/help/249873/how-to-use-the-regsvr32-tool-and-tr ...
- SAP smartforms打印数据出框线或跟框线重叠,但是预览是正常的
如图,打印内容压在框线上,但是打印预览是正常的 预览图如下,预览是正常的 预览用PDF!命令,导出PDF,也是正常的,就直接打印有问题,不是打印机的问题,用Adobe PDF打印机也是不行 如果只有一 ...
- 记录XorDDos木马清理步骤
1.检查 查看定时任务文件发现有两个异常定时任务 [root@manage ~]# cat /etc/crontab # * * * * * user-name command to be execu ...