[ CodeForces 1064 B ] Equations of Mathematical Magic
阿新 • • 發佈:2018-11-12
\(\\\)
\(Description\)
\(T\) 組詢問,每次給出一個 \(a\),求方程
\[ a-(a\oplus x)-x=0 \]
的方案數。
- \(T\le 10^3,a\le 2^{30}\)
\(\\\)
\(Solution\)
我菜又被巨佬 \(Diss\) 了......
考場 \(NC\) 問了爺們半懂不懂的就過了......
移項,得
\[ a=(a\oplus x)+x \]
然後注意到滿足這個性質的 \(x\) ,在二進位制表示下一定是 \(a\) 的子集。
因為\(a\oplus x\)表示的是兩者不交的部分的並集,再加上\(x\)
要是想要這個東西等於 \(a\) ,當且僅當 \(x\) 集合中不在 \(a\) 集合中的部分為空集。
然後就是統計 \(a\) 子集的個數。
顯然一開始答案為 \(1\) ,遇到二進位制位的一個 \(1\) 就答案個數就會翻倍。
\(\\\)
\(Code\)
#include<cmath> #include<cstdio> #include<cctype> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define R register #define gc getchar using namespace std; typedef long long ll; inline ll rd(){ ll x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x; } ll x,ans=1; void work(){ ans=1ll; x=rd(); while(x){ if((x&1ll)==1ll) ans<<=1; x>>=1; } printf("%I64d\n",ans); } int main(){ ll t=rd(); while(t--) work(); return 0; }