triples I

题目链接

题意

给一个$n$,然后要求构造最少的数字,使得他们都是3的倍数,且或起来为$n$。

思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<bits/stdc++.h>
using namespace std;
int fjw[64];
typedef long long ll;
vector<int> x[3];
int main()
{
for (int p = 0; p <= 62; p++)
fjw[p] = (1ll << p) % 3;
int T;
scanf("%d", &T);
while (T--)
{
ll n;
scanf("%lld", &n);
x[1].clear();
x[2].clear();
for (int p = 0; p <= 62; p++)
if ((n >> p) & 1)
x[fjw[p]].push_back(p);
if (n % 3 == 0)
{
printf("1 %lld\n", n);
continue;
}
if (x[n % 3].size() >= 2)
{
printf("2 %lld %lld\n", n - (1ll << x[n % 3][0]), n - (1ll << x[n % 3][1]));
}
else if (x[n % 3].size() == 1)
{
printf("2 %lld %lld\n", n - (1ll << x[n % 3][0]), (1ll << x[n % 3][0]) + (1ll << x[(3 - n % 3) % 3][1]));
}
else
{
printf("2 %lld %lld\n", n - (1ll << x[(3 - n % 3) % 3][0]) - (1ll << x[(3 - n % 3) % 3][1]),
(1ll << x[(3 - n % 3) % 3][0]) + (1ll << x[(3 - n % 3) % 3][1]) + (1ll << x[(3 - n % 3) % 3][2]));
}
}
return 0;
}
0%