【题解】CF1034E
题目描述
给定 和长度为 的数列 和 ,保证每个元素的值属于
生成序列 ,对于 ,有:
求 ,答案对 取模。
,时限
题解
貌似是一个FWT卷积的形式,但是有。
可以换个角度思考这样的操作有什么性质。
于是可以得出:当时,
那么可以对popcount不同的数分别操作,复杂度。
还有一个题目条件没有用到,数在模4意义下操作。
于是可以将变换为,b同理,最终的再模就可以刚好得到答案。
妙啊!!
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】