2017 Multi-University Training Contest-第三场 Kanade's convolution(FWT)
来源:互联网 发布:哪里有淘宝小号买 编辑:程序博客网 时间:2024/06/07 03:06
题目链接:
HDU 6057
题意:
给你
先让你求
看到卷积里面有位运算,就应该先想到
最后让你输出
其中,
题解:
官方题解。
看到卷积里面有位运算,就应该先想到
对于任意两个数
我们枚举
然后我们可以计算满足以上条件的
于是可以将
用
快速沃尔什变换
时间复杂度:
AC代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=998244353;const int N=(1<<20);int q_mod(int a, int b){ int res = 1; while(b) { if(b&1)res=1LL*res*a%mod; b>>=1; a=1LL*a*a%mod; } return res;}int A[N],B[N],C[N];int n,m;int bit[N];int aa[N][21];int bb[N][21];int cc[N][21];ll ds[21];void FWT(int a[N][21],int flag){ for(int i=1;i<n;i<<=1) { for(int j=0;j<n;j+=(i<<1)) { for(int k=0;k<=i-1;k++) { for(int l=0;l<=m;l++) { int x=a[j+k][l],y=a[i+j+k][l]; a[j + k][l]=(x + y)%mod; a[i + j + k][l]=(x - y + mod) % mod; } } } } if(flag==1) { int p=q_mod((mod+1)>>1,m); for(int i=0;i<=n-1;i++) { for(int j=0;j<=m;j++) { a[i][j]=1LL*a[i][j]*p%mod; } } }}/*2 1 2 3 45 6 7 8568535691*/int main(){ scanf("%d",&m); n=1<<m; for(int i=0;i<=n-1;i++) { scanf("%d",&A[i]); } for(int i=0;i<=n-1;i++){ scanf("%d",&B[i]); } for(int i=0;i<=n-1;i++) { bit[i]=bit[i>>1]+(i&1); } for(int i=0;i<=n-1;i++) { A[i]=1LL*A[i]*(1<<bit[i])%mod; } for(int i=0;i<=n-1;i++) { aa[i][bit[i]]=A[i]; bb[i][bit[i]]=B[i]; } FWT(aa,0); FWT(bb,0); for(int i=0;i<=n-1;i++) { memset(ds,0,sizeof(ds)); for(int j=0;j<=m;j++) { for(int k=0;k<=j;k++) { ds[j-k]=(ds[j-k]+1LL*bb[i][j]*aa[i][k]); if(ds[j-k]>=1LL<<63) { ds[j-k]%=mod; } } } for(int j=0;j<=m;j++) cc[i][j]=ds[j]%mod; } FWT(cc,1); for(int i=0;i<=n-1;i++){ C[i]=cc[i][bit[i]]; } int ans=0; int base=1; for(int i=0;i<=n-1;i++){ ans=(ans+1LL*C[i]*base)%mod; base=base*1LL*1526LL%mod; } printf("%d\n",ans); return 0;}
- 2017 Multi-University Training Contest-第三场 Kanade's convolution(FWT)
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest
- HDU 6057 Kanade's convolution(FWT)
- hdu 6058 Kanade's sum [区间第k大数求和] [2017 Multi-University Training Contest
- 2017 Multi-University Training Contest 3 && HDOJ 6058 Kanade's sum 【链表模拟】
- HDU 6059 Kanade's trio(2017 Multi-University Training Contest 3)
- 2017 Multi-University Training Contest 第一场
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU-6057 Kanade's convolution(多项式FWT)
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 骚猪队的模板
- Perl 在windows下打印中文乱码问题
- JAVA中静态代码块的用法 static关键字用法详解 类的加载顺序
- Android 插件化 RePlugin 入坑记录一
- MySQL 并集、交集、差集
- 2017 Multi-University Training Contest-第三场 Kanade's convolution(FWT)
- FOREIGN KEY 约束的ON UPDATE CASCADE 和 ON DELETE CASCADE
- 动态添加RudioButton,刷新Fragment上的数据
- php之Memcache的使用
- javascript iframe跳转问题
- memcpy实现
- 安卓,技术 目录
- 1040. 有几个PAT
- 在Ubuntu下配置Python开发环境