2024.5.31 做题记录

1. 外星千足虫

公元 \(2333\)\(2\)\(3\) 日,在经历了 \(17\) 年零 \(3\) 个月的漫长旅行后,“格纳格鲁一号”载人火箭返回舱终于安全着陆。此枚火箭由美国国家航空航天局(NASA)研制发射,行经火星、金星、土卫六、木卫二、谷神星、“张衡星”等 \(23\) 颗太阳系星球,并最终在小行星“杰森星”探寻到了地外生命。宇航员在“杰森星”地表岩层下 \(45.70\) 米位置发现一批珍贵的活体生命样本,并将其带回检测。

在带回的活体样本中,最吸引人的当属这些来自外星的千足虫了。这些虫子身躯纤长,身体分为若干节。受到触碰时,会将身体卷曲成圆环形,间隔一段时间后才会复原活动。

有趣的还不止如此。研究人员发现,这些虫子的足并不像地球千足虫成对出现、总共偶数条——它们每节身体下方都有着不定数量的足,但足的总数一定是奇数条!

虽然从外观难以区分二者,但通过统计足的数目,科学家们就能根据奇偶性判断出千足虫所属的星球。

作为 J 国派去 NASA 的秘密间谍,你希望参加这次研究活动以掌握进一步的情报,而 NASA 选拔的研究人员都是最优秀的科学家。于是 NASA 局长 Charles Bolden 出了一道难题来检测你的实力:

现在你面前摆有 \(1\ldots N\) 编号的 \(N\) 只千足虫,你的任务是鉴定每只虫子所属的星球,但不允许亲自去数它们的足。

Charles 每次会在这 只千足虫中选定若干只放入“昆虫点足机”(the Insect Feet Counter, IFC)中,“点足机”会自动统计出其内所有昆虫足数之和。Charles 会将这个和数 的结果反馈给你,同时告诉你一开始放入机器中的是哪几只虫子。

他的这种统计操作总共进行 \(M\) 次,而你应当尽早得出鉴定结果。

假如在第 \(K\) 次统计结束后,现有数据就足以确定每只虫子的身份,你就还应将这个 \(K\) 反馈给 Charles,此时若 \(K<M\),则表明那后 \(M-K\) 次统计并非必须的。

如果根据所有 \(M\) 次统计数据还是无法确定每只虫子身份,你也要跟 Charles 讲明:就目前数据会存在多个解。

\(1 \le N \le 10^3\)\(1 \le M \le 2 \times 10^3\)


解答

发现这非常高斯消元,但是注意到 \(N\)\(1000\) 所以寄。

发现矩阵为 \(01\) 矩阵,于是 bitset 跑一下。

正确性由于:\({(a \& c)}\)^\({(b \& c)}=(a\)^\(b)\& c\),故显然。

#include<bits/stdc++.h>
namespace Limie{
	#define x first
	#define y second
	using namespace std;
	typedef long long LL;
	typedef unsigned long long ULL;
	typedef pair<int,int> PII;
}using namespace Limie;
int n,m;
int main()
{
	int i,j,k,c=0;
	cin>>n>>m;
	bitset<1000> a[n],b;
	for(j=1;j<=m;j++){
		string st;char ch;
		cin>>st>>ch;b[n]=ch-'0';
		for(i=0;i<n;i++)b[i]=st[i]-'0';
		for(i=0;i<n;i++){
			if(!b[i])continue;
			if(a[i][i])b^=a[i];else{a[i]=b,c++;break;}
		}
		if(i==n)continue;
		if(c==n){
			cout<<j<<'\n';
			for(j=n-1;j>=0;j--)
				for(k=j+1;k<n;k++)
					if(a[j][k])a[j]^=a[k];
			
			for(j=0;j<n;j++)puts(a[j][n]?"?y7M#":"Earth");
			return 0;
		}
	}puts("Cannot Determine");
}

posted @ 2024-05-31 23:34  Limie  阅读(16)  评论(0)    收藏  举报