FZU 1704 高斯消元

来源:互联网 发布:林原惠美 知乎 编辑:程序博客网 时间:2024/06/16 17:16


这题其实就是求自由变量的个数n 然后就有2^n种方法

注意要用到高精度 一开始不知道错在哪 wa了一天 最后得知是高精度的问题...

#include<cstdlib>#include<cstring>#include<cstdio>#include<string>#include<cmath>typedef long long ll;#define exp 1e-8#define up(i,x,y) for(i=x;i<=y;i++)#define down(i,x,y) for(i=x;i>=y;i--)#define mem(a,x) memset(a,x,sizeof(a))using namespace std;const int MAXN=110;const int mod=1000000007;const int inf=0x3f3f3f3f;//对2取模的01方程组//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到varint equ,var;int a[MAXN][MAXN]; //增广矩阵int x[MAXN]; //解集int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)int free_num;//自由变元的个数int n;//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数int Gauss(){    int i,j,k,max_r,col;    free_num=0;        for(k=0,col=0;k<equ&&col<var;k++,col++)    {        max_r=k;        for(i=k+1;i<equ;i++)        {            if(abs(a[i][col])>abs(a[max_r][col]))                max_r=i;        }        if(a[max_r][col]==0)        {            free_x[free_num++] = col;//这个是自由变元            k--;            continue;        }        if(max_r!=k)        {            for(j=col;j<var+1;j++)            {                swap(a[k][j],a[max_r][j]);            }        }        for(i=k+1;i<equ;i++)        {            if(a[i][col]!=0)            {                for(j=col;j<var+1;j++)                {                    a[i][j]^=a[k][j];                }            }        }            }            return var-k;        }int gaojingdu(int n){    const int x = 2;//计算x的n次方    int a1[1000] = { 0 };    int b = 0;//用来计算向前  进的数字    a1[999] = 1;    for (int i = 0; i<n; i++){        int j = 999;        while (j >= 0){            int k = a1[j] * x + b;            a1[j] = k % 10;            b = k / 10;            j--;        }    }    int s;    for (s = 0; s<1000; s++){        if (a1[s] != 0)            break;    }    printf("%d",a1[s]);    s++;    for (; s<1000; s++){        printf("%d",a1[s]);           }     printf("\n");    return 1;}int main(){        int T,i,j;    int n,m;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        var=m;        equ=n;        mem(a,0);        mem(x,0);        for(i=0;i<n;i++)        {            scanf("%d",&a[i][m]);        }        for(i=0;i<m;i++)        {            int k,t;            scanf("%d",&k);            while(k--)            {                scanf("%d",&t);                a[t-1][i]=1;            }        }                int tt=Gauss();        if(tt==0)            printf("1\n");        else        gaojingdu(tt);            }    return 0;}