
题意
给一个$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
|
using namespace std; int fjw[64]; typedef long long ll; vector<int> x[3]; int () { 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 %lldn", n); continue; } if (x[n % 3].size() >= 2) { printf("2 %lld %lldn", n - (1ll << x[n % 3][0]), n - (1ll << x[n % 3][1])); } else if (x[n % 3].size() == 1) { printf("2 %lld %lldn", n - (1ll << x[n % 3][0]), (1ll << x[n % 3][0]) + (1ll << x[(3 - n % 3) % 3][1])); } else { printf("2 %lld %lldn", 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; }
|
近期评论