内部网站建设、,微网站策划方案,企业网站方案设计,新网互联 网站上传正题
题目链接:https://www.luogu.com.cn/problem/P6097 题目大意
长度为2n2^n2n的序列a,ba,ba,b求一个ccc满足 ck∑i∣jk,ij∅aibjc_k\sum_{i|jk,i\j\varnothing}a_i\times b_jcki∣jk,ij∅∑aibj 解题思路
从炫酷反演魔术过来的#xff0c;顺便写…正题
题目链接:https://www.luogu.com.cn/problem/P6097 题目大意
长度为2n2^n2n的序列a,ba,ba,b求一个ccc满足 ck∑i∣jk,ij∅ai×bjc_k\sum_{i|jk,i\j\varnothing}a_i\times b_jcki∣jk,ij∅∑ai×bj 解题思路
从炫酷反演魔术过来的顺便写掉这题
简单的说就是求kkk的所有子集和其补集的乘积和。 只有i∣jki|jki∣jk的话就是普通的FWT\text{FWT}FWT了但是还有ij∅i\j\varnothingij∅这个东西。 一个巧妙的想法是把这个条件转换为∣i∣∣j∣∣i∪j∣|i||j||i\cup j|∣i∣∣j∣∣i∪j∣显然两个之间是充要的。 然后可以把aia_iai存在fct(i),if_{ct(i),i}fct(i),i这个位置其中ct(i)ct(i)ct(i)表示iii中111的个数。同理bib_ibi存在gct(i),ig_{ct(i),i}gct(i),i这个位置。
然后就有卷积 ha,b∑ija,x∣ybfi,x×gj,yh_{a,b}\sum_{ija,x|yb}f_{i,x}\times g_{j,y}ha,bija,x∣yb∑fi,x×gj,y 这个先暴力FWT\text{FWT}FWT了f,gf,gf,g然后暴力卷积然后IFWT\text{IFWT}IFWT回去就好了。
时间复杂度O(n22n)O(n^22^n)O(n22n)不能全开long long\text{long long}long long不然会T\text TT的 code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N21,P1e99;
int n,k,ct[1N],f[N][1N],g[N][1N],h[N][1N];
void FWT(int *f,int op){for(int p2;pn;p1)for(int k0,lenp1;kn;kp)for(int ik;iklen;i)(f[ilen](f[i]*opP)%P)%P;return;
}
signed main()
{// printf(%d,sizeof(f)20);scanf(%d,k);n(1k);for(int i0;in;i){if(i)ct[i]ct[i-(i-i)]1;scanf(%d,f[ct[i]][i]);}for(int i0;in;i)scanf(%d,g[ct[i]][i]);for(int i0;ik;i)FWT(f[i],1),FWT(g[i],1);for(int i0;ik;i)for(int j0;ji;j)for(int x0;xn;x)(h[i][x]1ll*f[j][x]*g[i-j][x]%P)%P;for(int i0;ik;i)FWT(h[i],-1);for(int i0;in;i)printf(%d ,h[ct[i]][i]);return 0;
}