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 }