B
性质:第i个数会被操作i的质因数次,只有完全平方数的质因数为奇数个。
奇数次操作后灯为关着 二分答案即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
int k;
bool check(int mid)
{
int x=sqrtl(mid);
if(mid-x>=k)
return true;
return false;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
cin>>k;
int l=1,r=2e18+1;
while(l<r)
{
int mid=l+r>>1;
if(check(mid))r=mid;
else
l=mid+1;
}
cout<<l<<endl;
}
C
从拆位的方向去考虑,根据或操作性质结果会越来越大,&的操作会使结果越来越小,所以等式的左端减去右端一定大于0,不存在借位问题,我们根据性质分解每一位,除去不满足题意情况,当bcd为110或011时可虑累加答案,其他时候a的进制位上位0
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,d;
bool check(ll x,int i)
{
return (x&(1ll<<i));
}
void slove()
{
cin>>b>>c>>d;
a=0;
for(int i=61;i>=0;i--)
{
if(check(b,i)==1&&check(c,i)==1&&check(d,i)==0)
a+=(1ll<<i);
if(check(b,i)==1&&check(c,i)==0&&check(d,i)==0)
{
cout<<-1<<endl;
return ;
}
if(check(b,i)==0&&check(c,i)==0&&check(d,i)==1)
a+=(1ll<<i);
if(check(b,i)==0&&check(c,i)==1&&check(d,i)==1)
{
cout<<-1<<endl;
return ;
}
}
cout<<a<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
slove();
}
}