1. 程式人生 > >Codeforces1064B——Equations of Mathematical Magic

Codeforces1064B——Equations of Mathematical Magic

給定a,求方程 a ( a x )

x = = 0 a-(a 異或 x)-x==0 的非負數解的個數,方程其實就是 a
x = = a x a-x==a異或x

找規律,發現都是2的冪,隊友直接看出是a中1的個數是n,則2^n
(不會證明,不過可以看出按位減法和異或的關係,0-0 和0異或0是不同的,其他都是相同的,所以找出a中1的位數有n個,所以x就由這n個1中選出幾個來與a中的1對應異或或者相減即可,那麼組合就有2^n中情況

程式碼:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int main(void){
    // for(int a=1;a<=100;a++){
    //     int sum=0;
    //     for(int x=0;x<=a;x++){
    //         if(a-(a^x)-x==0){
    //             sum++;
    //         }
    //     }
    //     printf("%d %d\n",a,sum);
    // }
    int t;
    scanf("%d",&t);
    long long a;
    while(t--){
        scanf("%I64d",&a);
        int s=0;
        while(a){
            if(a&1){
                s++;
            }
            a/=2;
        }
        //printf("%d\n",s);
        printf("%.0lf\n",pow(2,s));
    }
    return 0;
}