补题、
我们发现对于 a 最好的情况肯定是 a^b = 111111111...1 111 而 a&b = 0
所以直接贪心就好了,
但是 当 a = 11111....1111 的时候 从 0 - a-1 很显然只有0成立,但是原题范围 在 1-a-1
所以特殊讨论一下,
我们发现 当 a = 1111111...1111 的时候 a^b + a&b == a
因为 1^0 = 1, 1&0=0; 1^1 = 0 , 1&1 = 1
所以我们不过再找 x+y = a 使得 __gcd( x, y ) 最大而已,因为 a还是比较大的 接近 3e7 ,而 t为 100, 肯定不是让你暴力的,
我们发现 我们要找的就是最大因数,为什么这么讲
因为 设 g = __gcd(x, y) 因为 g 为 x y 因数,我们如果想让 g 个尽可能大,那么 a = a1 *g + a2*g,
a = (a1+a2) * g ,k = a1+a2
g = a/k 那么最大因数证明完毕。
上AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
#define ll long long int
ll a,b;
ll yi(ll x)
{
for(ll i=2;i*i<=x;i++)
{
if(x%i==0)
{
return x/i;
}
}
return 1;
}
int main()
{
int t;cin>>t;
while(t--)
{
cin>>a;bool fl = false;
for(int i=26;i>=1;i--)
{
if(a == (1<<i)-1)
{
fl=true;
break;
}
}
if(! fl)
{
int ct = 0;
while(a){a/=2; ct++;}
int t = 0;
for(int i=1;i<=ct;i++)
{
t= t<<1|1;
}
cout<<t<<endl;
}
else
{
cout<<yi(a)<<endl;
}
}
return 0;
}