高斯消元

原创 2016年08月28日 16:34:02
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int a[72][72],x[72],r,c,mod;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}
int pow_mod(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void Gauss()
{
    int k,col,max_r,i,j,LCM,ta,tb,temp;
    for(k=col=0;k<r&&col<c;col++)  //枚举行,列从0开始
    {
        max_r=k;
        for(i=k+1;i<r;i++)
            if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;   //找到这一列里面绝对值最大的
        if(!a[max_r][col]) continue;   //最大的都是0,那么这一列不用考虑了
        if(max_r!=k)
            for(i=col;i<=c;i++) swap(a[max_r][i],a[k][i]);  //否则交换
        for(i=k+1;i<r;i++)
            if(a[i][col]!=0)
            {
                LCM=lcm(abs(a[i][col]),abs(a[k][col]));
                ta=LCM/abs(a[i][col]);
                tb=LCM/abs(a[k][col]);
                if(a[i][col]*a[k][col]<0) tb=-tb;
                for(j=col;j<=c;j++) a[i][j]=((a[i][j]*ta%mod-a[k][j]*tb%mod)+mod)%mod;
            }
        k++;
    }
    //for(i=k;i<r;i++) if(a[i][col]) return -1;
    for(i=c-1;i>=0;i--)
    {
        temp=a[i][col];
        for(j=i+1;j<c;j++)
            if(a[i][j]!=0) temp=((temp-a[i][j]*x[j]%mod)+mod)%mod;
        x[i]=temp*pow_mod(a[i][i],mod-2)%mod;
    }
}
int main()
{
    int i,j,t,v;
    scanf("%d",&t);
    char s[72];
    while(t--)
    {
        memset(a,0,sizeof(a));
        scanf("%d%s",&mod,s);
        r=c=strlen(s);
        for(i=0;i<r;i++) a[i][c]=(s[i]=='*'?0:s[i]-96);
        for(i=0;i<r;i++)
        {
            v=a[i][0]=1;
            for(j=1;j<c;j++)
            {
                v=v*(i+1)%mod;
                a[i][j]=v;
            }
        }
        Gauss();
        for(i=0;i<r;i++)
            printf("%d%c",x[i],i+1==r?'\n':' ');
    }
}









// 模2时的高斯消元
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int a[35][35],b[35],r,c,mod=2;
int Gauss()
{
    int k,col,max_r,i,j;
    for(k=col=0;k<r&&col<c;col++)  //枚举行,列从0开始
    {
        max_r=k;
        for(i=k+1;i<r;i++)
            if(abs(a[i][col])>abs(a[max_r][col]) )max_r=i;   //找到这一列里面绝对值最大的
        if(!a[max_r][col]) continue;   //最大的都是0,那么这一列不用考虑了
        if(max_r!=k)
            for(i=col;i<=c;i++) swap(a[max_r][i],a[k][i]);  //否则交换
        for(i=k+1;i<r;i++)
            if(a[i][col]!=0)
                for(j=col;j<=c;j++) a[i][j]^=a[k][j];
        k++;
    }
    for(i=k;i<r;i++)
        if(a[i][col]) return 0;
    if(k<c) return 1<<(c-k);
    return 1;
}
int main()
{
    int i,t,v,u;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        scanf("%d",&r);  c=r;
        for(i=0;i<r;i++) scanf("%d",&b[i]);
        for(i=0;i<r;i++)
        {
            scanf("%d",&v);
            a[i][c]=b[i]^v;
            a[i][i]=1;
        }
        while(scanf("%d%d",&u,&v)&&u) a[v-1][u-1]=1;
        v=Gauss();
        if(v) printf("%d\n",v);
        else printf("Oh,it's impossible~!!\n");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 1222 高斯消元详解

题意 有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。 现在要你求出一个5 * 6的矩阵,1表示这个灯被...
  • u013508213
  • u013508213
  • 2015年08月03日 22:34
  • 2195

高斯消元原理

高斯消元法的步骤: 设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数不同) 1. 把方程组转换成增广矩阵。 2. 利用初等行...
  • ACdreamers
  • ACdreamers
  • 2013年05月30日 17:10
  • 3758

整数高斯消元模板

#include #include #include using namespace std; #define MAXN 400 int a[MAXN+10][MAXN+10],x[MAXN+10],...
  • outer_form
  • outer_form
  • 2016年01月28日 11:28
  • 436

同余意义下的高斯消元解决几类常见的问题+例题

高斯消元法 以下高斯消元指的是列主元高斯消元法。 高斯消元法除了解浮点数线性方程,它还可以用于求矩阵的秩,求某些线性空间中的一组线性无关的基,解同余方程组。 求秩 SGU 200 Crac...
  • abc13068938939
  • abc13068938939
  • 2016年12月13日 19:10
  • 612

高斯消元算法 详解

对于正在学习或已经学完线性代数的同学来说,高斯消元并不算是一个新的知识点(假如你在课堂上认真听讲并且没有挂科的话)         首先来看一下什么是高斯消元,其实说白了,就是线性代数里通过矩阵求线...
  • wr132
  • wr132
  • 2014年11月27日 19:52
  • 813

高斯消元快速入门

高斯消元快速入门 一、基本描述 学习一个算法/技能,首先要知道它是干什么的,那么高斯消元是干啥的呢? 高斯消元主要用来求解线性方程组,也可以求解矩阵的秩,矩阵的逆。在ACM中是一个有力的...
  • pengwill97
  • pengwill97
  • 2017年08月15日 21:32
  • 522

高斯消元模板

mod 2 方程写法: int Gauss(int n, int m){ int r = 0, c = 0; while(r < n && c < m){ int id...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015年05月05日 21:32
  • 1376

高斯消元法 (模板)

/* 用于求整数解得方程组. */ #include #include #include using namespace std; const int maxn = 105; //矩阵大小 i...
  • FeBr2
  • FeBr2
  • 2016年08月15日 14:35
  • 516

高斯消元原理

高消一直是ACM中高层次经常用到的算法,虽然线性代数已经学过,但高消求解的问题模型及高消模板的应用变化是高消的最复杂之处。 先介绍一下高消的基本原理:引入互联网czyuan的帖子: 高斯消元法,是...
  • xuanandting
  • xuanandting
  • 2016年08月15日 16:30
  • 1165

浮点数高斯约当消元法模板

void read(){ Read(n),Read(m); int i,j; for(i=1;i
  • outer_form
  • outer_form
  • 2016年01月27日 23:13
  • 648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高斯消元
举报原因:
原因补充:

(最多只允许输入30个字)