Codeforces Round #613 (Div. 2)

D. Dr. Evil Underscores

题意

寻找一个x,使得他与数组中数的异或的最大值最小

分析

分治位运算

代码


inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
vector<int >v;
int dfs(int i,vector<int > &v)
{
	vector<int>v0,v1;
	if(i<0)return 0;
	for(auto j:v)
	{
		if((j>>i)&1)v1.push_back(j);//如果这一位是1 
		else v0.push_back(j);//如果这一位是0 
	}
	if(v0.size()==0)return dfs(i-1,v1);//全是1
	if(v1.size()==0)return dfs(i-1,v0);//全是0
	return  min(dfs(i-1,v0),dfs(i-1,v1))+(1<<i);
}
main(void)
{
	int n=read();
	_1for(i,n)
	{
		ll t=read();
		v.push_back(t);
	}
	cout<<dfs(30,v)<<endl;
}

C

题意

给你一个整数X,求出最小公倍数是X的两个数a,b,并且要求a,b的二者较大值尽可能小。

思路

已知:最大公约数GCD(a,b)=p和最小公倍数LCM(a,b)=q的关系是:q=a*b/p ,即 LCM(a,b)=a * b / GCD(a,b) ——①;

易知当 a∗b=X 时 max(a,b) 最小 ,且① 即 当GCD(a,b)=1 所以直接枚举答案判断。

代码

#include<bits/stdc++.h>
#define int long long
#define _0for(i, a) for(int i = 0; i < (a); ++i)
#define _1for(i, a) for(int i = 1; i <=(a); ++i)
using namespace std;
int gcd(int p,int q)
{
	if(p==0)return q;
	else
	{
		return gcd(q%p,p);
	}
}
main(void)
{

	int a,b,x;
	cin>>x;
	for(int i=1;i*i<=x;i++)
	{
		if(x%i==0)
		{
			if(gcd(i,x/i)==1)
			{
				a=i;
				b=x/i;
			}
		} 
	}
	printf("%lld %lld\n",a,b);
}



posted @ 2020-07-10 18:27  王乾宇  阅读(346)  评论(0编辑  收藏  举报