「杂题乱刷2」CF862C

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

于是就有了这篇题解。

题目链接

CF862C Mahmoud and Ehab and the xor

解题思路

思路非常简单。

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

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

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

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

那么这样,单次错误的概率远远比 110 要小,一份代码跑 6 遍,错误的概率比 1106 要小,因此通过这题是完全没有问题的。

参考代码

点击查看代码
#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 @   wangmarui  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示