首页 > 其他分享 >[ABC367G] Sum of (XOR^K or 0)

[ABC367G] Sum of (XOR^K or 0)

时间:2024-08-27 20:04:26浏览次数:3  
标签:XOR text Sum ABC367G popcount FWT prod sum

My Blogs

[ABC367G] Sum of (XOR^K or 0)

考虑求出 \(ans_i\) 表示选了 \(m\) 的倍数个数,异或和是 \(i\) 的方案数再统计答案。

先考虑 \(m=1\) 怎么做。相当于是 \(ans_i=[x^i]\prod_j (x^0+x^{a_j})\),这里的乘法是异或卷积。如果直接 xor-FWT 复杂度不如暴力。令 \(F_i(x)\) 表示第 \(i\) 个数对应的集合幂级数,列出式子:

\[\begin{aligned} f_k&=[x^k]\text{FWT}(\prod_i F_i(x))\\ &=\prod_i ((-1)^{\text{popcount}(k\And a_i)}+(-1)^{\text{popcount}(k\And 0)})\\ &=\prod_i ((-1)^{\text{popcount}(k\And a_i)}+1)\\ \end{aligned} \]

所以只需要对于每个 \(k\) 求出求出 \(\text{popcount}(k\And a_i)\) 是奇数和偶数的 \(j\) 的个数。考虑构造一个新的集合幂级数 \(G_i(x)\),满足 \(G_i(x)=x^{a_i}\),所以 \(\text{FWT}(G_i(x))=\sum_j x^j(-1)^{\text{popcount}(j\And a_i)}\)。

\[g_k=\sum_{i}(-1)^{\text{popcount}(k\And a_i)}=\sum_i [x^k]\text{FWT}(G_i(x)) \]

因为 FWT 是线性变换,所以

\[g_k=[x^k]\text{FWT}(\sum_i G_i(x)) \]

\(x\) 表示 \(\text{popcount}(k\And a_i)\) 是偶数的个数,\(y\) 表示奇数,则有

\[\left\{\begin{matrix} x+y=n\\ x-y=g_k \end{matrix}\right. \]

可以对于每个 \(k\) 解出来 \(x,y\)。这样就求出来了异或卷积的 FWT 数组 \(f_i\),把 \(f\) IFWT 回去就得到了 \(ans_i\)。

对于如何拓展到 \(m\not=1\),其实也很简单,看成在 \(x\) 中选若干个,\(y\) 中选若干个,要求选的总数是 \(m\) 的倍数并且在 \(y\) 中每选一个都要乘一个 \(-1\)。预处理 \(a_{i,j}=\sum_{k\equiv j\pmod m}\binom{i}{k}\) 和 \(b_{i,j}=\sum_{k\equiv j\pmod m}\binom{i}{k}(-1)^k\),然后把 \(a,b\) 合并起来就能求出 \(c_i\) 表示有 \(i\) 个 \(1\),\(n-i\) 个 \(-1\),在之中选 \(m\) 的倍数个的所有方案的权值乘积和,然后令 \(f_i=c_x\) 即可。总复杂度 \(\mathcal O(nm+k2^k)\),其中 \(k=20\)。

const int N=1<<20;
int n,m,K,f[N],F[200010][110],G[200010][110],H[200010];
inline void mian()
{
	read(n,m,K),F[0][0]=G[0][0]=1;int x,y,iv=power(N,MOD-2),ans=0;
	for(int i=0;i<n;++i)for(int j=0;j<m;++j)
	Madd(F[i+1][j],F[i][j]),Madd(F[i+1][(j+1)%m],F[i][j]),
	Madd(G[i+1][j],G[i][j]),Mdel(G[i+1][(j+1)%m],G[i][j]);
	for(int i=0;i<=n;++i)for(int j=0;j<m;++j)
	Madd(H[i],Cmul(F[i][j],G[n-i][(m-j)%m]));
	for(int i=1;i<=n;++i)read(x),++f[x];
	for(int i=1;i<N;i<<=1)for(int j=0;j<N;j+=i<<1)for(int k=j;k<j+i;++k)
	x=f[k]+f[k+i],y=f[k]-f[k+i],f[k]=x,f[k+i]=y;
	for(int i=0;i<N;++i)f[i]=H[(n+f[i])>>1];
	for(int i=1;i<N;i<<=1)for(int j=0;j<N;j+=i<<1)for(int k=j;k<j+i;++k)
	x=Cadd(f[k],f[k+i]),y=Cdel(f[k],f[k+i]),f[k]=x,f[k+i]=y;
	for(int i=0;i<N;++i)Madd(ans,Cmul(f[i],iv,power(i,K)));
	write(ans);
}

标签:XOR,text,Sum,ABC367G,popcount,FWT,prod,sum
From: https://www.cnblogs.com/WrongAnswer90/p/18383402

相关文章

  • C# yield keyword relieve congest and consume at the same time with produce
    usingSystem.Threading;namespaceConsoleApp57{internalclassProgram{staticvoidMain(string[]args){PrintNumers();Console.WriteLine("Hello,World!");}staticvoidPrintN......
  • [ARC182C] Sum of Number of Divisors of Product 题解
    题目链接点击打开链接题目解法我怎么不会分治/fn首先把\(x\)分解成\(\prodp_i^{x_i}(0\lei\le5)\)的形式,正因数个数为\(\prod(x_i+1)\)有一个很牛的想法是:合并两个\(x_i\)序列(假设一个叫\(x_0,...,x_5\),另一个叫\(y_0,...,y_5\))先不考虑后面的\(+1\)(可以最后......
  • [Javascript] How to do big integers sum
    /***Bigintegersum*Usingstringstorepresentbigintegers*@param{string}a*@param{string}b*@returns{string}*/functionbigIntSum(a,b){constmaxLength=Math.max(a.length,b.length);constaStr=a.padStart(maxLength,"0&......
  • [Javascript + Performance] How to run a large number of time-consuming tasks and
    Tryoption1:Promise PromiserunninginMicrotaskqueue,andrenderingshouldwaituntilthequeueisempty;Ifyouhavealargenumberoftime-consuminginmicrotask,itwillalsoblockrenderingfunctionrunTask(task){Promise.resolve().then(()=&g......
  • Summarization with Langchain
    教程链接—https://youtu.be/w6wOhSThnoo摘要是自然语言处理(NLP)的一个关键方面,它能够将大量文本浓缩成简洁的摘要。LangChain,作为NLP领域中的一个强大工具,提供了三种不同的摘要技术:stuff、map_reduce和refine。每种方法都有其独特的优点和局限性,使它们适用于不同的情况。本文深......
  • 两幅图像间的逻辑操作,与、或、非、异或:bitwise_and( ) bitwise_or( ) bitwise_not( )
    学OpenCV===============================================================================================这里额外看了下使用mask的情形 ===============================================================================================代码1#include<iostre......
  • 题解:AT_abc140_e [ABC140E] Second Sum
    思路:双向链表+组合数学(不过你要用单调栈也没人拦着你)我们现在先抛开题面,先换个思路。我们现在求:这个数能做多少个区间的次大值。我们现在设\(l1,l2,r1,r2\)分别为左边第一个比这个数大的id,第二个比这个数大的id,右边第一个比这个数大的id,第二个比这个数大的id。竟然是......
  • 2024 Summer_Camp 做题总结 下
    CloseVertices思路很明显,这是一道点分治题目,但有两个限制条件,考虑将两个条件排序起来,双指针找第一个条件,树状数组维护第二个条件,但是同一个子树内不能重复统计,所以将答案减去每个子树内的答案。代码#include<iostream>#include<algorithm>#defineintlonglongusingnam......
  • P1466 [USACO2.2] 集合 Subset Sums
    题目描述对于从\(1\simn\)的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果\(n=3\),对于\(\{1,2,3\}\)能划分成两个子集合,每个子集合的所有数字和是相等的:\(\{3\}\)和\(\{1,2\}\)是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不......
  • 2024 NVIDIA Summer Camp Day1:构建RAG多模态AI Agent
    下载材料和课件等课程相关资料下载链接:https://pan.baidu.com/s/15Y-gmsfeYCgKF-M3TJZVgg?pwd=fafe提取码:fafe 1.课件链接:https://pan.baidu.com/s/15JTy9CqnesXSlPiwwrUmjA?pwd=1111 提取码:1111 2.phi3量化大模型链接:https://pan.baidu.com/s/10HqxpkJmSyg-Bb......