1. 程式人生 > >【CF_516_div2_B】Equations of Mathematical Magic

【CF_516_div2_B】Equations of Mathematical Magic

連結

(減法、位數均為二進位制下)

簡化:

給出a , 對於方程 a-(a\, xor\, x )-x=0  問有多少非負解。

如果這是一道noip題,資料肯定有很大一部分是模擬分,所以暴力列舉拿到一半以上應該不成問題。

於是我試了一下,發現了一個規律:對於一個a, 它的答案就是它所有子集的個數。

即   ans(a)=2^{bitsize(a)} (bitsize是a二進位制下1的個數)。

這個確實過了。但為什麼是對的呢?

首先把方程移一下項:

a\, xor\,x=a-x

a\,xor\,x相當於a對x做不借位減法:

     

所以當  a-x  在不進行借位操作,那麼方程成立,反之不成立。

那麼這個 x 為了保證不借位,每一位都必須小於等於 a 相應位上的數,即:

a_bit=0時,x_bit=0

a_bit=1時,x_bit=1/0

按照乘法原理,就得出了上面的結論:ans(a)=2^{bitsize(a)}

(疑似程式碼)

#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