Gym - 100851J [随机+01集合]

题目链接:https://vjudge.net/problem/Gym-100851J

 

解题思路:

出题故意不给501次,就是要让我们去随机找出值为n/2的串,每次最坏的情况随机一个串值是n/2的概率是:\frac{C(1000,500))}{2^{1000}}

约等于0.022。那我们随机400不中的概率是0.98^{400} = 0.000309336,概率非常低,所以几乎是可以找到的。

找到之后s串后,同时改变0和i位置的值,询问此时值是否还是n/2,如果是,也就是说0和i是对立的,一个如果和原串相同,那么另一个就不同。如果不是,说明他们是相同的,相同一起相同,不相同一起不相同。

最后我们再枚举0位置的值是0或者1就可以找出原串了。

#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const int mx = 1e3+10;
int n,m,K;
char s[mx],ts[mx];	
int vis[mx];
int fa[mx*2];
int main(){
	srand(time(NULL));
	scanf("%d",&n);
	for(int i=0;i

 

你可能感兴趣的:(交互机,思维题,建设性)