高斯消元总结
创始人
2024-02-13 13:32:29
0

A-Matrix Equation_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)(重现赛)

         自己写一个2维矩阵或者3维矩阵就可以发现对于每一列来说都是独立的,每一列的n个Cij都是都关系的,这就构成了一个n元一次方程组,其实这就是解一下这个方程组,但是他是问的有多少个矩阵,对于这个方程组构造出的矩阵来说,有多少自由元就说明有多少个Cij是可以任意取值的,也就是有1,2两种选择,不是自由元的就只能有1种;自由元是指系数都是0的未知数,自由元的个数就是高斯消元后0行的个数,所以用高斯消元就可以求出来;

        又因为有运算是模2的,所以也就可以看成是异或型矩阵,那么运算方式就要稍微的发生以下变化,比如

上述图片来自2020icpc-济南站_琅歌的博客-CSDN博客 

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 2e5+100;
const double eps=1e-8;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int getinv(int a){return qpow(a,mod-2LL);}
int n;
int a[220][220],b[220][220],d[220][220],fac[N];
int gauss()
{int newline=1;for(int k=1;k<=n;k++){int p=newline;for(int i=newline+1;i<=n;i++)if(d[i][k]>d[p][k]) p=i;if(d[p][k]==0) continue;swap(d[newline],d[p]);for(int i=newline+1;i<=n;i++){if(d[i][k]==0) continue;for(int j=1;j<=n;j++)d[i][j]^=d[newline][j];}newline++;}newline--;return n-newline;
}
void print()
{cout<<"--------------------\n";for(int i=1;i<=n;i++){for(int k=1;k<=n;k++)cout<>n;fac[0]=1;for(int i=1;i<=100000;i++) fac[i]=fac[i-1]*2LL%mod;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) cin>>a[i][j],d[i][j]=a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) cin>>b[i][j];int ans=1;for(int j=1;j<=n;j++){for(int i=1;i<=n;i++) for(int k=1;k<=n;k++) d[i][k]=a[i][k];for(int i=1;i<=n;i++)d[i][i]=a[i][i]^b[i][j];//print();int res=gauss();//print();//cout<

借助这个题又回顾了一下高斯消元的东西,高斯消元其实就是大一学的矩阵的行列变换使得矩阵变为行阶梯型,步骤为:

1.设一变量newline代表进行到了第几行,最外层枚举列号k,内层枚举行i,找到最大的a[i][k]让其作为主元,将第i行与第newline行交换,如果最大的a[i][k]==0说明该变量是自由元,跳过去操作下一列;

2.将主元下面的数都消掉,就是行变换

3.操作结束后常数项/主元系数就是该未知数的解

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 2e5+100;
const double eps=1e-8;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int sgn(double x)
{if(fabs(x)>n;for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++) cin>>a[i][j];gauss();system("pause");return 0;
}

P2962 [USACO09NOV]Lights G - dfs+高斯消元

这题也是异或方程组,可以发现假设每个灯按的次数是xi,那么对于每一个灯来说

xj1^xj2^xj3^...^xi^...^xjm=1,j[1...m]是与i相连的灯,n个灯就构成了n元异或方程组,高斯消元后,如果有自由元的存在就要枚举这个灯开着优还是关掉优,最后取一个最优值即可

题解 P2962 【[USACO09NOV]灯Lights】 - Youngsc_AFO 的博客 - 洛谷博客 (luogu.com.cn)

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 4e5+100;
const double eps=1e-8;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int sgn(double x)
{if(fabs(x)>n>>m;for(int i=1;i<=n;i++) a[i][i]=a[i][n+1]=1;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;a[u][v]=a[v][u]=1;}//print();gauss();ans=inf;//print();dfs(n,0);cout<

P5027 Barracuda - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

根据题意列出方程然后枚举每一个方程是错误的,注意判断不合法的几个细节就可以,然后比较的时候一定要fabs,虽然都是正的,但是不加就是会wa,,,

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 4e5+100;
const double eps=1e-10;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int sgn(double x)
{if(fabs(x)v[105];
int gauss()
{int nl=1;for(int k=1;k<=n;k++){int p=nl;for(int i=nl+1;i<=n;i++) if(fabs(a[p][k])1) return 0;return ma;
}
void print()
{cout<<"-----------------------------\n";for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++)cout<>n;for(int i=1;i<=n+1;i++){int m;cin>>m;for(int j=1;j<=m;j++){int x;cin>>x;v[i].push_back(x);}cin>>b[i];}int ans=-1,mark=0;for(int i=1;i<=n+1;i++){for(int j=1;j<=n;j++)for(int k=1;k<=n+1;k++) a[j][k]=0;int cnt=0;for(int j=1;j<=n+1;j++){if(i==j)continue;cnt++;for(int k=0;k1){ans=-1;break;}}}if(ans==-1) cout<<"illegal\n";else cout<

P2447 [SDOI2010] 外星千足虫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一开始就构造成m行n+1列的方程组直接高斯消元,记录最大用到的行就是最小的K,N太大就用bitset优化,有一篇题解是不需要bitset的,但是我不知道他的做法为什么对就没采用,还是老老实实的用bitset吧

题解 P2447 【[SDOI2010]外星千足虫】 - YoungNeal 的博客 - 洛谷博客

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 4e5+100;
const double eps=1e-10;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int sgn(double x)
{if(fabs(x)a[2005];
bool gauss()
{ans=0;int nl=1;for(int k=1;k<=n;k++){int p=nl;for(int i=nl;i<=m;i++) if(a[i][k]==1){p=i;break;}if(a[p][k]==0) return 0;ans=max(ans,p);swap(a[p],a[nl]);for(int i=1;i<=m;i++){if(i==nl||a[i][k]==0) continue;// for(int j=k;j<=n+1;j++)// a[i][j]^=a[nl][j];a[i]^=a[nl];}nl++;}nl--;return nl>=n;
}
void print()
{cout<<"-----------------------------\n";for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++)cout<>n>>m;for(int i=1;i<=m;i++){cin>>(s[i]+1);for(int j=1;j<=n;j++) a[i][j]=(s[i][j]-'0');int x;cin>>x;a[i][n+1]=x;}if(gauss()){cout<

P2973 [USACO10HOL]Driving Out the Piggies G - 高斯消元解方程组,概率

假设期望是经过这个点几次才会爆炸,那么期望其实是和概率在数值上是一样的了,也就是把每走一步的代价看作1,也就相当于在求期望了,f[i]表示经过了多少次i点会爆炸,然后根据题意就可以列出

f[i]=1+sum(f[j]*(1-P)*(1/in[j])) (i==1)

f[i]=sum(f[j]*(1-P)*(1/in[j])) (i!=1)

P是爆炸的概率,in[j]是j的度数,j可以到达i,j一共可以到达in[j]个点,j到达i的概率就是1/in[j],f[i]就可以通过j来转移,当i==1时因为一开始的起点就是1,所以1这个点一开始就经过了一次,所以要加上1

#include 
using namespace std;
#define endl '\n'
#define int long long
const int mod=998244353;
const int inf=1e18;
const int N = 4e5+100;
const double eps=1e-10;
int qpow(int a,int b)
{int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int sgn(double x)
{if(fabs(x)>n>>m>>p>>q;P=p/q;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;in[u]++;in[v]++;e[u][v]=e[v][u]=1;}for(int i=1;i<=n;i++) a[i][i]=1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(e[i][j]) a[i][j]-=a[j][j]*(1.0-P)/in[j];}}a[1][n+1]=1;gauss();system("pause");return 0;
}

相关内容

热门资讯

生活哲理句子摘录 2022年通用生活哲理句子摘录76句  当今社会,知识就是资本,知识就是财富。谁占有知识,谁就占有发...
高一新生寄语 高一新生寄语(合集15篇)  在我们平凡的日常里,大家都用到过寄语吧,寄语是人们所传的抑或是寄托希望...
夏目友人帐治愈语录   《夏目友人帐》是由日本动画公司Brain's Base制作的电视动画作品,于2008年7月7日播...
早安正能量简单一句话 早安正能量简单一句话大全  在日常生活或是工作学习中,大家总免不了要接触或使用句子吧,句子由词或词组...
怎样与陌生人聊天技巧 怎样与陌生人聊天技巧  同陌生人交谈是口语交际中的一大难关,处理得好,可以一见如故,相见恨晚;处理得...
学员培训感言 学员培训感言(通用12篇)  在平凡的学习、工作、生活中,我们难免会萌生一些新的感悟,这时写感言是一...
光棍节经典励志语录   大河向东流啊,人间的光棍去泡妞啊,说走咱就走啊,你走我走全都走啊!路见对象一声吼啊,看上我就跟我...
老同学聚会经典感言精选   岁月匆匆,转眼毕业已经多年,多年后再聚首,大家又会有什么感言呢?今天CN人才小编为大家收集整理的...
肖骁奇葩说经典语录   1、我都娘成这样了还不想aa制,你个大老爷们儿还想aa制!  2、如果给我大城市的一张床,我有信...
辰东的语录 辰东的语录  在日常生活或是工作学习中,许多人对一些广为流传的语录都不陌生吧,语录是对某些事理进行高...
聂鲁达经典语录   导语:我喜欢你是寂静的,仿佛你不在这山河岁月里。你从远处聆听我,我的声音却无法触及你。以下是小编...
于丹经典爱情语录   全世界的人都离开你了我也会在你身边,有地狱我们一起猖獗。  1. 因为我知道你是个容易担心的小孩...
端午节安康问候语 端午节安康问候语  在日常学习、工作抑或是生活中,许多人都写过问候语吧,问候语可以传达对他人的关切和...
体育教师获奖感言   体育教师获奖感言一  尊敬的各位领导、来宾、同学们大家下午好:  我是来自上海市建平实验中学的王...
运动会获奖感言 运动会获奖感言1、从今早开始,我就一直忙于这边的工作,处理七七八八的小事。 我认为自己在后勤工作方面...
人生感言语录 精选人生感言语录40句  腾不出时间来睡觉的人,迟早会腾出时间来生病;腾不出时间来复习的人,迟早会腾...
川端康成经典语录 川端康成经典语录  在平平淡淡的日常中,大家都经常接触到语录吧,语录具有短小简约,不重文彩的特点。什...
树上春树爱情语录 树上春树爱情语录  在日常学习、工作或生活中,大家都接触过很多有名的语录吧,语录具有篇幅简短,语言精...
高中生班主任寄语 高中生班主任寄语(精选130句)  在平日的学习、工作和生活里,大家都尝试过写寄语吧,寄语是所传的话...
三生三世菩提树下经典语录 佛...   生即死,死亦生,生死不由于命,物定亦胜天,佛本道,道亦佛,佛道皆生于物,菩提本无树,何惧生死?下...