E-Exclusive OR 2020牛客多校第2场

https://ac.nowcoder.com/acm/contest/5667/E

线性基可以求出任意取出一些数的最大值

其实可以想到到了后面就会把线性基每一位填满了,因为数字大小只有2^18,那应该只有18位,那么做20次fwt算出答案就可以了

满秩了后答案就是有规律的了,可以知道ans[i]=ans[i-2],因为可以选两个相同的抵消掉,还是最大值

为什么不能ans[i]=ans[i-1]呢,因为会有 1 1 1 1 这种东西出现。。。

#include
using namespace std;
const int mod=998244353,r2=mod/2+1;
int a[300010],b[300010];
int ans[25];
int ad(int x,int y){
    return x+y>=mod?x+y-mod:x+y;
}
void fwtxor(int a[],int k,int arr){
    for(int mid=1;mid=0;j--){
            if(b[j]){
                ans[i]=j;
                break;
            }
        }
        fwtxor(b,k,1);
        for(int i=0;il+2){
            if(i%2==l%2)printf("%d ",ans[l+2]);
            else printf("%d ",ans[l+1]);
        }
        else printf("%d ",ans[i]);
    }
}

 

你可能感兴趣的:(FWT)