bzoj1923[Sdoi2010]外星千足虫
题意:
n只两种动物,一种有奇数只脚,另一种偶数只角。现在进行m次操作,每次告诉你若干只动物的脚数之和为奇数还是偶数。要求你输出所有动物的类型以及最少多少次操作就能判断。n≤1000,m≤10000
题解:
设放进去的动物的系数为1,没放的系数为0,脚数如果是奇数结果就为1,偶数结果为0,解异或方程,具体看代码。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <bitset> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 1010 7 using namespace std; 8 9 bitset <maxn> M[maxn*2]; int n,m,ans; char s[maxn]; 10 void gause(){ 11 int now=0,pos; 12 inc(i,1,n){ 13 for(pos=now+1;pos<=m&&!M[pos][i];pos++); if(pos==m+1){ans=-1; return;}else ans=max(ans,pos); 14 now++; swap(M[now],M[pos]); inc(j,1,m)if(j!=now&&M[j][i])M[j]^=M[now]; 15 } 16 } 17 int main(){ 18 scanf("%d%d",&n,&m); 19 inc(i,1,m){scanf("%s",s+1); inc(j,1,n)M[i][j]=s[j]-'0'; int a; scanf("%d",&a); M[i][n+1]=a;} 20 gause(); 21 if(ans==-1)printf("Cannot Determine");else{ 22 printf("%d\n",ans); inc(i,1,n)printf(M[i][n+1]?"?y7M#\n":"Earth\n"); 23 } 24 return 0; 25 }
20160616