zoukankan      html  css  js  c++  java
  • 【uoj#310】[UNR #2]黎明前的巧克力 FWT

    题目描述

    给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等。求总方案数。

    输入

    第一行一个正整数 $n$ ,表示巧克力的个数。
    第二行 $n$ 个整数 $a_i$ 表示每个巧克力的美味值。

    输出

    输出一行一个整数,表示能使得他们心情契合的吃巧克力的方案数对 998244353 取模的结果。

    样例输入

    6
    1 2 3 4 5 6

    样例输出

    80


    题解

    FWT

    首先如果两个集合的异或相等,那么它们的异或为0。原问题转化为求选出一个异或和为0的集合并分为两个即可的方案数。

    那么设 $f[i][j]$ 表示前 $i$ 个数中选出的数的异或和为 $j$ 的方案数。那么就有 $f[i][j]=f[i-1][j]+2·f[i-1][j xor a[i]]$ 。

    可以发现这是一个异或卷积的形式,相当于每次卷的是:$b[0]=1,b[a[i]]=2$ ,然而并无卵用 = =

    考虑对这个过程进行FWT,那么:

    0对每个位置的贡献都是1;
    a[i]对某些位置的贡献是2,对某些位置的贡献是-2。

    所以每次卷上的 $b$ 数组的每个数都是-1或3。

    另有:和的FWT等于FWT的和。

    因此把它们求和后进行FWT,那么就知道了每个位置FWT的和。

    由于只有-1和3,因此可以解出-1和3的个数,然后快速幂处理一下即可。

    最终再逆FWT回来即可。

    时间复杂度 $O(nlog n)$ 

    #include <cstdio>
    #define N 1050000
    #define mod 998244353
    typedef long long ll;
    ll a[N] , b[N];
    ll pow(ll x , ll y)
    {
    	ll ans = 1;
    	while(y)
    	{
    		if(y & 1) ans = ans * x % mod;
    		x = x * x % mod , y >>= 1;
    	}
    	return ans;
    }
    void fwt(ll *a , int n , int flag)
    {
    	int i , j , k , t;
    	for(i = 1 ; i < n ; i <<= 1)
    		for(j = 0 ; j < n ; j += (i << 1))
    			for(k = j ; k < j + i ; k ++ )
    				t = a[k] , a[k] = (t + a[k + i]) * flag % mod , a[k + i] = (t - a[k + i] + mod) * flag % mod;
    }
    int main()
    {
    	int n , mx = 0 , m = 1 , i , x;
    	scanf("%d" , &n);
    	for(i = 1 ; i <= n ; i ++ )
    	{
    		scanf("%d" , &x) , a[0] ++ , a[x] += 2;
    		if(mx < x) mx = x;
    	}
    	while(m <= mx) m <<= 1;
    	fwt(a , m , 1);
    	for(i = 0 ; i < m ; i ++ )
    	{
    		x = (n + a[i]) * 748683265 % mod;
    		if(((x + n) % mod) & 1) b[i] = (mod - pow(3 , x)) % mod;
    		else b[i] = pow(3 , x);
    	}
    	fwt(b , m , 499122177);
    	printf("%lld
    " , (b[0] - 1 + mod) % mod);
    	return 0;
    }
    
  • 相关阅读:
    JVM 重排序
    Dispatcher & Redirect
    Struts2-ActionContext
    eclipse+tomcat+maven debug的时候总是出现source not found /Edit lookup path...的问题解决方案
    web Listener
    优质博客
    IDEA中jdk设置
    chrome json插件
    IDEA快速复习
    MarkDown编辑器下载
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/8182183.html
Copyright © 2011-2022 走看看