「杂题乱刷2」CF862C

怎么题解区里都没有随机化的题解啊 /jy。

于是就有了这篇题解。

题目链接

CF862C Mahmoud and Ehab and the xor

解题思路

思路非常简单。

首先容易发现在 \(n = 1\) 时,直接构造一个 \(x\) 这个数即可。

其次我们考虑 \(n = 2\) 的情况,由于异或的基本性质,我们可以得出当 \(x = 0\) 时是一定无解的,其余情况直接构造 \(x\)\(0\) 这两个数字即可,容易发现这两个数字一定不相等。

之后,我们就可以进行随机化了。

我们考虑先构造两个数为 \(x \oplus 1\)\(1\) 这两个数字,然后进行大力随机化,考虑随机 \(n - 3\) 个不同与之前构造过的数字,然后最后一个数字根据所有数字异或和为 \(x\) 的条件,直接将之前构造出来的所有数字求出异或和,然后将这个异或和设为 \(sum\),那么最后一个数字即为 \(sum \oplus x\),注意,如果这个数字与之前的数字重复了,那么我们充分发扬人类智慧,运用 CF 一份 TLE 的代码会跑 \(6\) 遍的机制,直接让你当前的程序 TLE 即可。

那么这样,单次错误的概率远远比 \(\frac{1}{10}\) 要小,一份代码跑 \(6\) 遍,错误的概率比 \(\frac{1}{10^6}\) 要小,因此通过这题是完全没有问题的。

参考代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll _t_;
ll n,m;
void _clear(){}
map<ll,ll>mp;
long long Ss=chrono::steady_clock::now().time_since_epoch().count();
mt19937_64 Apple(Ss);
long long rand_lr(ll l,ll r){
	return Apple()%(r-l+1)+l;
}
ll sum;
void solve()
{
	mp.clear();
	_clear();
	cin>>n>>m;
	if(n==1)
	{
		cfy;
		cout<<m<<endl;
		return ;
	}
	if(n==2)
	{
		if(m!=0)
		{
			cfy;
			cout<<(m^1)<<' '<<1<<endl;
		}
		else
			cfn;
		return ;
	}
	cfy;
	cout<<(m^1)<<' ';
	mp[m^1]=1;
	sum=(m^1);
	forl(i,1,n-2)
	{
		ll rd=rand_lr(1,4e5);
		while(mp[rd])
			rd=rand_lr(1,4e5);
		mp[rd]=1;
		cout<<rd<<' ';
		sum^=rd;	
	}
	if(mp[sum^m])
	{
		cout<<"Wrong Answer.\n";
		while(1);
	}
	cout<<(sum^m)<<endl;
}
int main()
{
	IOS;
	_t_=1;
	while(_t_--)
		solve();
	QwQ;
}
posted @ 2024-08-29 15:39  wangmarui  阅读(2)  评论(0编辑  收藏  举报