快速沃尔什变换

#include <bits/stdc++.h>
using namespace std;
int aa[1<<18],bb[1<<18],cc[1<<18];
void fwt(int *a,int l,int r){
    if (l==r) return;
    int n=(r-l+1)/2,mid=l+n-1;
    fwt(a,l,mid);fwt(a,mid+1,r);
    for (int i=l;i<=mid;i++){
        int x=a[i],y=a[i+n];
        a[i]=x+y;a[i+n]=y;//关键
    }//AND沃尔什变换
}//Fwt(A)=(Fwt(A0+A1),Fwt(A1))
void dwt(int *a,int l,int r){
    if (l==r) return;
    int n=(r-l+1)/2,mid=l+n-1;
    dwt(a,l,mid);dwt(a,mid+1,r);
    for (int i=l;i<=mid;i++){
        int x=a[i],y=a[i+n];
        a[i]=x-y;a[i+n]=y;//关键
    }//AND逆变换
}//Dwt(A)=(Dwt(A0−A1),Fwt(A1))
int main(){
    int k;
    cin>>k;
    int t=1<<k;
    for(int i=0;i<t;i++)cin>>aa[i];
    for(int i=0;i<t;i++)cin>>bb[i];
    fwt(aa,0,t-1);
    fwt(bb,0,t-1);
    for(int i=0;i<t;i++)cc[i]=aa[i]*bb[i];
    dwt(cc,0,t-1);
    for(int i=0;i<t;i++)cout<<cc[i]<<endl;
    return 0;
}

若为XOR
fwt改为a[i]=x+y;a[i+n]=x-y;
dwt改为a[i]=(x+y)/2;a[i+n]=(x-y)/2;
若为OR
fwt改为a[i]=x;a[i+n]=x+y;
dwt改为a[i]=x;a[i+n]=y-x;

题目:A,B两个数组,长度n=2^k(1<=K<=17)
执行如下操作
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i op j]+=a[i]*b[j];
Now op is and
Please output the array c

Input
2
1 2 4 8
2 3 5 8
Output
68
46
92
64

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值