首页 > 其他分享 >【题解】CF1034E

【题解】CF1034E

时间:2023-03-20 16:58:17浏览次数:43  
标签:... int 题解 unsigned popcount ansn CF1034E

题目描述

给定 \(n\) 和长度为 \(2^n\) 的数列 \(a_{0},a_{1}...a_{2^n-1}\) 和 \(b_{0},b_1...b_{2^n-1}\),保证每个元素的值属于 \([0,3]\)

生成序列 \(c\),对于 \(c_i\),有:

\[c_i=\sum_{j|k=i,j\&k=0} a_j\times b_k \]

求 \(c_{0},c_1...c_{2^n-1}\),答案对 \(4\) 取模。

\(n\le 21\),时限 \(\rm 1s\)

题解

貌似是一个FWT卷积的形式,但是有\(j\&k=0\)。
可以换个角度思考这样的操作有什么性质。
于是可以得出:当\(popcount(j)+popcount(k)=popcount(i)\)时,\(c_i=\sum_{j|k=i} a_j\times b_k\)
那么可以对popcount不同的数分别操作,复杂度\(n^2 2^n\)。
还有一个题目条件没有用到,数在模4意义下操作。
于是可以将\(a_j\)变换为\(a_j\times 4^{popcount(j)}\),b同理,最终的\(c_i\)再模\(4^{popcount(i)}\)就可以刚好得到答案。
妙啊!!

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=2100010;
int n;
unsigned int a[N],b[N],c[N];
char s[N];
unsigned int fw[30];
unsigned int cal(int x){
	int ansn=0;
	while(x)ansn+=(x%2==1),x/=2;
	return fw[ansn];
}
void fwt(unsigned int *f,int tag){
	for(int k=1;k<=n;k*=2){
		for(int i=0;i<n;i+=k*2){
			for(int j=0;j<k;j++)if(i+j+k<n)f[i+j+k]+=f[i+j]*tag;
		}
	}
	return ;
}
signed main(){
	n=(1<<rd());
	scanf("%s",s);
	for(int i=0;i<n;i++)a[i]=s[i]-'0';
	scanf("%s",s);
	for(int i=0;i<n;i++)b[i]=s[i]-'0';
	fw[0]=1;
	for(int i=1;i<=21;i++)fw[i]=fw[i-1]*4;
	for(int i=0;i<n;i++)a[i]*=cal(i),b[i]*=cal(i);
	fwt(a,1),fwt(b,1);
	for(int i=0;i<n;i++)c[i]=a[i]*b[i];
	fwt(c,-1);
//	for(int i=0;i<n;i++)cout<<c[i]<<" ";
//	cout<<"\n";
	for(int i=0;i<n;i++)c[i]=c[i]/cal(i)%4;
	for(int i=0;i<n;i++)cout<<c[i];
	return 0;
}

标签:...,int,题解,unsigned,popcount,ansn,CF1034E
From: https://www.cnblogs.com/T-water/p/17236882.html

相关文章

  • 【题解】CF889E
    题目描述\[f(x,n)=x\moda_n\]\[f(x,i)=(x\moda_i)+f(x\moda_i,i+1)\]给出a序列,当x取遍所有非负整数时\(f(x,1)\)的最大值。题解首先注意到\(a_i\)只......
  • 【题解】CF1368E
    题目描述有一个由\(n\)个点\(m\)条边组成的有向无环图,每个点出度至多为2。您需要标记一些点(不超过\(\frac{4}{7}n\)个)。标记一个点\(u\)将会删除所有与\(u\)连......
  • 【题解】CF1225F
    题目描述给出一棵n个节点的有根树T,点编号为0∼n−1。记f(u)为u的父节点。初始时你有一条n个点的链L(标号任意),每次操作你可以令f(u)←f(f(u))。需要将链改造......
  • 【题解】CF1439A2
    题目描述给定一个\(n\timesm\)的\(01\)矩阵,每次操作可以将某个\(2\times2\)的矩阵内的\(3\)个数取反,请在\(n\timesm\)步内将矩阵变为全\(0\)。题解这种题......
  • C# 上传接口返回错误: (413) Request Entity Too Large问题解决
    问题报错:Failedtoloadresource:theserverrespondedwithastatusof413(RequestEntityTooLarge)找了很多方法,说什么反向代理配置啥的其实很多项目并没有开反......
  • CF1804C 题解
    题目链接今天好不容易有空更那就再更一篇(一道很有意思的诈骗题,我会写出我的思考过程。题意:(我的翻译)一个转盘有$n$个格子分别为$0$$1$$2$$\cdots$$n-1$,初始时在......
  • 【题解】ABC294
    AtCoderBeginnerContest294AFilter无意义题,找出所有偶数。BASCIIArt无意义题,按题意模拟。CMergeSequences无意义题,离散化即可。DBank无意义题,set维护即......
  • ucyhf 题解
    题目传送门愚人节题目,具体题面看翻译。先写一个判断素数的函数,这题并不需要什么特殊的筛法,新手可以参考以下代码。boolisprime(intx){if(x<=1)return0;......
  • Party 题解
    题目传送门一道简单的并查集练手题。与普通的并查集不同,除此之外还需记录下来某两人的讨厌关系,使得他们不能在同一集合中。if(find_root(x)==find_root(y))vis[find......
  • CF1060E 题解
    前言题目传送门!更好的阅读体验?提供一种更加麻烦的换根DP写法。思路代码#include<iostream>#include<cstdio>usingnamespacestd;typedeflonglongll;cons......