题意:给出一个数a,让你找出尽可能少的几个3的倍数,使得这些数字或运算为a。
题解:参考官方题解:
每一个二进制位mod 3要么为1,要么为2,。那么我们就可以分类讨论了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
vector<LL>vec[2];
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
LL a;
scanf("%lld",&a);
if(a%3==0){
printf("1 %lld\n",a);
continue;
}
vec[0].clear();
vec[1].clear();
for(int i=0;i<=60;i++){
if((a>>i)&1){
vec[i&1].push_back(1LL<<i);
}
}
int s=(a%3==2);
LL x,y;
if(vec[s].size())
{
x=a-vec[s][0];
if(vec[!s].size()){
y=vec[s][0]+vec[!s][0];
}
else y=a-vec[s][1];
}
else{
x=a-vec[!s][0]-vec[!s][1];
y=vec[!s][0]+vec[!s][1]+vec[!s][2];
}
printf("2 %lld %lld\n",x,y);
}
return 0;
}