【CF_516_div2_B】Equations of Mathematical Magic
阿新 • • 發佈:2018-12-15
連結
(減法、位數均為二進位制下)
簡化:
給出a , 對於方程 問有多少非負解。
如果這是一道noip題,資料肯定有很大一部分是模擬分,所以暴力列舉拿到一半以上應該不成問題。
於是我試了一下,發現了一個規律:對於一個a, 它的答案就是它所有子集的個數。
即 (bitsize是a二進位制下1的個數)。
這個確實過了。但為什麼是對的呢?
首先把方程移一下項:
相當於a對x做不借位減法:
所以當 在不進行借位操作,那麼方程成立,反之不成立。
那麼這個 x 為了保證不借位,每一位都必須小於等於 a 相應位上的數,即:
a_bit=0時,x_bit=0
a_bit=1時,x_bit=1/0
按照乘法原理,就得出了上面的結論:
(疑似程式碼)
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<stack> using namespace std; int n; int k; void rec(int k) { int ans=1; while(k){ if(k%2){ ans*=2; } k/=2; } printf("%d\n",ans); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&k); rec(k); } }
為什麼是疑似程式碼呢。。
因為我走錯考場了,沒辦法交QAQ