triples I Posted on 2019-07-27 | In acm , 做题记录 , 2019多校赛 , 牛客 题目链接题意给一个$n$,然后要求构造最少的数字,使得他们都是3的倍数,且或起来为$n$。 思路1234567891011121314151617181920212223242526272829303132333435363738394041#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;}