5573 Binary Tree 構造
阿新 • • 發佈:2019-02-12
題意:給出一顆二叉樹,根節點為1,子節點為父節點的2倍和2倍+1,從根節點開始依次向下走k層,問如何走能使得將路徑上的數進行加減最終結果得到n。
做題一定要注意資料範圍! n <= 2^k啊!
是真的沒想到利用差值去搞事情。。
程式碼:
#include<bits/stdc++.h> #define ll long long using namespace std; int main() { int T, kase = 1; ll n, k; cin >> T; while(T--) { cin >> n >> k; bool flag = 0; ll all = (1ll << k) - 1, delta; delta = all - n; if(delta & 1){ delta++;//這裡相當於多減去了1,要在最後一層加回來 flag = 1; } delta >>= 1; printf("Case #%d: \n", kase++); for(int i = 0; i < k - 1; i++){ if(delta >> i & 1) printf("%lld -\n", 1ll << i); else printf("%lld +\n", 1ll << i); } if(flag) printf("%lld +\n", (1ll << (k - 1)) + 1); else printf("%lld +\n", 1ll << (k - 1)); } }