B - SETI POJ - 2065 (高斯消元)

题目链接:https://vjudge.net/contest/276374#problem/B

题目大意:

输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2...,同时题目定义了一个函数:a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)(mod p), f(1) = str[0] = a = 1;

a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)(mod p), f(2) = str[1] = b = 2;

..........
a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)(mod p),f(n) = str[n-1] = ````

求出 a0,a1,a2....an-1。

按照提示建立矩阵就可以了。

AC代码:

  1 #include<iostream>
  2 #include<stack>
  3 #include<cstring>
  4 #include<iomanip>
  5 #include<stdio.h>
  6 #include<algorithm>
  7 #include<cmath>
  8 #include<queue>
  9 using namespace std;
 10 # define ll long long
 11 # define inf 0x3f3f3f3f
 12 const int mod = 21252;
 13 const int maxn = 40;
 14 int a[maxn][maxn];
 15 int equ,var;
 16 int b[maxn][maxn];
 17 int x[maxn];
 18 int free_x[maxn];
 19 int free_num;
 20 int Gass()
 21 {
 22     int max_r,col,k;
 23     free_num=0;
 24     for(k=0,col=0; k<equ&&col<var; k++,col++)
 25     {
 26         max_r=k;
 27         for(int i=k+1; i<equ; i++)
 28         {
 29             if(abs(a[i][col])>abs(a[max_r][col]))
 30                 max_r=i;
 31         }
 32         if(a[max_r][col]==0)
 33         {
 34             k--;
 35             free_x[free_num++]=col;
 36             continue;
 37         }
 38         if(max_r!=k)
 39         {
 40             for(int j=col; j<var+1; j++)
 41                 swap(a[k][j],a[max_r][j]);
 42         }
 43         for(int i=k+1; i<equ; i++)
 44         {
 45             if(a[i][col]!=0)
 46             {
 47                 for(int j=col; j<var+1; j++)
 48                     a[i][j]^=a[k][j];
 49             }
 50         }
 51     }
 52     for(int i=k; i<equ; i++)
 53         if(a[i][col]!=0)
 54         {
 55             return -1;
 56         }
 57     if(k<var)
 58         return var-k;
 59     for(int i=var-1; i>=0; i--)
 60     {
 61         x[i]=a[i][var];
 62         for(int j=i+1; j<var; j++)
 63             x[i]^=(a[i][j]&&x[j]);
 64     }
 65     return 0;
 66 }
 67 int n;
 68 void init()
 69 {
 70     memset(x,0,sizeof(x));
 71     memset(a,0,sizeof(a));
 72     equ=20;
 73     var=20;
 74     for(int i=0; i<20; i++)
 75     {
 76         a[i][i]=1;
 77         if(i>0)
 78             a[i-1][i]=1;
 79         if(i<20-1)
 80             a[i+1][i]=1;
 81     }
 82 }
 83 int solve()
 84 {
 85     int t=Gass();
 86     if(t==-1)
 87     {
 88         return t;
 89     }
 90     else if(t==0)
 91     {
 92         int  ans=0;
 93         for(int i=0; i<n*n; i++)
 94             ans+=x[i];
 95         return ans;
 96     }
 97     else
 98     {
 99         int ans=inf;
100         int tot=(1<<t);
101         for(int i=0; i<tot; i++)
102         {
103             int cnt=0;
104             for(int j=0; j<t; j++)
105             {
106                 if(i&(1<<j))
107                 {
108                     cnt++;
109                     x[free_x[j]]=1;
110                 }
111                 else
112                 {
113                     x[free_x[j]]=0;
114                 }
115             }
116             for(int j=var-t-1; j>=0; j--)
117             {
118                 int dex;
119                 for(dex=j; dex<var; dex++)
120                     if(a[j][dex])
121                         break;
122                 x[dex]=a[j][var];
123                 for(int l=dex+1; l<var; l++)
124                 {
125                     if(a[j][l])
126                         x[dex]^=x[l];
127                 }
128                 cnt+=x[dex];
129             }
130             ans=min(ans,cnt);
131         }
132         return ans;
133     }
134 }
135 int main()
136 {
137   // freopen("hqx.txt","r",stdin);
138     init();
139     int tmp;
140     for(int i=0; i<20; i++)
141     {
142         scanf("%d",&tmp);
143         a[i][20]=tmp;
144     }
145     int t=solve();
146     printf("%d\n",t);
147     return 0;
148 }

 

转载于:https://www.cnblogs.com/letlifestop/p/10437768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值