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
",a,b);
}