怎么题解区里都没有随机化的题解啊 /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}\) 要小,因此通过这题是完全没有问题的。
参考代码
/*
Tips:
你数组开小了吗?
你MLE了吗?
你觉得是贪心,是不是该想想dp?
一个小时没调出来,是不是该考虑换题?
打 cf 不要用 umap!!!
记住,rating 是身外之物。
该冲正解时冲正解!
Problem:
算法:
思路:
*/
#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 pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define aty cout<<"Yes\n";
#define atn cout<<"No\n";
#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;
// cfy;
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<<' ';
mp[m]=1;
sum=m;
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;
// cin>>_t_;
while(_t_--)
solve();
QwQ;
}
标签:数字,ll,long,随机化,异或,杂题,CF862C,define
From: https://www.cnblogs.com/wangmarui/p/18386822