高斯消元法 专题
大神博客
今年多校遇到一道高斯消元模板題,當(dāng)時(shí)沒做,主要原因還是太菜,簡(jiǎn)單題都沒做完。。。。。賽后回過頭來刷題解說是高斯消元(這一直都是隊(duì)友負(fù)責(zé)的),所以我還是一臉懵逼。隊(duì)友說這題完全可以暴力,我只有一個(gè)字:哦。。。。。。。
入門題:
poj 1222 EXTENDED LIGHTS OUT
思路:已經(jīng)有很多相關(guān)的博客寫過題解,我就不累述了。關(guān)鍵的就是:
?
hdu 5755 Gambler Bo
solution: 一個(gè)mod3版本的開關(guān)燈問題,對(duì)每個(gè)格子分別設(shè)操作了xi次,那么就可以列出一個(gè)n*m的方程組,然后高斯消元就可以了
/**************************************************************Problem:hdu 5755 Gambler BoUser: youmiLanguage: C++Result: AcceptedTime:483MSMemory:4828Ksolution: 一個(gè)mod3版本的開關(guān)燈問題,對(duì)每個(gè)格子分別設(shè)操作了xi次,那么就可以列出一個(gè)n*m的方程組,然后高斯消元就可以了 ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep(i,from,to) for(int i=from;i<=to;i++) #define irep(i,to,from) for(int i=to;i>=from;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define eps 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl const double pi=4*atan(1.0);using namespace std; typedef long long ll; template <typename T> inline void read(T &n) {char c; int flag = 1;for (c = getchar(); !(c >= '0' && c <= '9' || c == '-'); c = getchar()); if (c == '-') flag = -1, n = 0; else n = c - '0';for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0'; n *= flag; } template<class T> inline T gcd(T a,T b) {if(b==0)return a;return gcd(b,a%b); } template<class T> inline T lcm(T a,T b) {return a*b/gcd(a,b); } int Pow(int base, ll n, int mo) {if (n == 0) return 1;if (n == 1) return base % mo;int tmp = Pow(base, n >> 1, mo);tmp = (ll)tmp * tmp % mo;if (n & 1) tmp = (ll)tmp * base % mo;return tmp; } //*************************** int n,m; const int maxn=900+10; int a[maxn][maxn]; int x[maxn]; int fre[maxn]; int index; int kx[]={1,-1,0,0}; int ky[]={0,0,1,-1}; void debug(int rw,int cl) {rep(i,0,rw-1){rep(j,0,cl-1)printf("%d ",a[i][j]);printf("\n");} } bool is_out(int xx,int yy,int rw,int cl) {if(xx<0||yy<0||xx>=rw||yy>=cl)return true;return false; } void init() {memset(fre,1,sizeof(fre));zeros(x);zeros(a); } int gauss(int rw,int cl) {int i,j,k;int mx=0;for(i=0,j=0;i<rw&&j<cl-1;i++,j++){mx=i;for(k=i;k<rw;k++){if(abs(a[k][j])>abs(a[mx][j]))mx=k;}if(mx!=i){for(k=j;k<cl;k++)swap(a[mx][k],a[i][k]);}if(a[i][j]==0){i--;continue;}for(k=i+1;k<rw;k++){if(a[k][j]!=0){int Lcm=lcm(a[k][j],a[i][j]);int ti=Lcm/a[i][j],tk=Lcm/a[k][j];for(int t=j;t<cl;t++){a[k][t]=((a[k][t]*tk-a[i][t]*ti)%3+3)%3;}}}}//debug(rw,cl);for(k=rw-1;k>=0;k--){int temp=a[k][cl-1]%3;for(int t=k+1;t<cl-1;t++)temp=((temp-a[k][t]*x[t])%3+3)%3;x[k]=temp*a[k][k]%3;}return 0; } int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint T_T;scanf("%d",&T_T);for(int kase=1;kase<=T_T;kase++){sc2(n,m);init();int temp=0;rep(i,0,n-1)rep(j,0,m-1){sc(a[i*m+j][n*m]);a[i*m+j][n*m]=(3-a[i*m+j][n*m])%3;}rep(i,0,n-1){rep(j,0,m-1){a[temp][i*m+j]=2;rep(k,0,3){if(!is_out(i+kx[k],j+ky[k],n,m))a[temp][(i+kx[k])*m+j+ky[k]]=1;}temp++;}}gauss(n*m,n*m+1);int cnt=0;rep(i,0,n-1)rep(j,0,m-1)if(x[i*m+j])cnt+=x[i*m+j];printf("%d\n",cnt);rep(i,0,n-1){rep(j,0,m-1){while(x[i*m+j]){printf("%d %d\n",i+1,j+1);x[i*m+j]--;}}}} }?
轉(zhuǎn)載于:https://www.cnblogs.com/youmi/p/5719940.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: 51 单片机 跑马灯2
- 下一篇: 去除下拉框的默认样式