• 快速沃尔变换 FWT


    P4717 【模板】快速沃尔什变换

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%lld",&(x));
    #define si signed
    const int maxn=1<<18+2;
    int A[maxn];
    int B[maxn];
    int C[maxn];
    #define mod 998244353
    #define inv2 ((mod+1)/2)
    int n;
    int t;
    void FWT_or(int *C,int op)
    {
        for(int i=1;i<n;i<<=1){
            for(int p=i<<1,j=0;j<n;j+=p){
                for(int k=0;k<i;k++){
                    if(op==1)C[i+j+k]=(C[i+j+k]+C[j+k])%mod;
                    if(op==-1)C[i+j+k]=(C[i+j+k]-C[j+k]+mod)%mod;
                }
            }
        }
    }
    void FWT_and(int *C,int op)
    {
        for(int i=1;i<n;i<<=1){
            for(int p=i<<1,j=0;j<n;j+=p){
                for(int k=0;k<i;k++){
                    if(op==1)C[j+k]=(C[i+j+k]+C[j+k])%mod;
                    if(op==-1)C[j+k]=(C[j+k]+mod-C[i+j+k])%mod;
                }
            }
        }
    }
    void FWT_xor(int *C,int op)
    {
        for(int i=1;i<n;i<<=1){
            for(int p=i<<1,j=0;j<n;j+=p){
                for(int k=0;k<i;k++){
                    int x=C[j+k],y=C[i+j+k];
                    C[j+k]=(x+y)%mod;
                    C[j+k+i]=(x-y+mod)%mod;
                    if(op==-1){
                        C[j+k]=C[j+k]*inv2%mod;
                        C[j+k+i]=C[j+k+i]*inv2%mod;
                    }
                }
            }
        }
    }
    si main()
    {
    
        sc(t);
        n=(1<<t);
        for(int i=0;i<n;i++){
            sc(A[i]);
        }
        for(int i=0;i<n;i++){
            sc(B[i]);
        }
        FWT_or(A,1);FWT_or(B,1);
        for(int i=0;i<n;i++){
            C[i]=(A[i]*B[i])%mod;
        }
        FWT_or(A,-1);FWT_or(B,-1);
        FWT_or(C,-1);
        for(int i=0;i<n;i++){
            cout<<C[i]<<' ';
        }
        cout<<'
    ';
        FWT_and(A,1);FWT_and(B,1);
         for(int i=0;i<n;i++){
            C[i]=(A[i]*B[i])%mod;
        }
        FWT_and(A,-1);FWT_and(B,-1);
        FWT_and(C,-1);
        for(int i=0;i<n;i++){
            cout<<C[i]<<' ';
        }
        cout<<'
    ';
        FWT_xor(A,1);FWT_xor(B,1);
         for(int i=0;i<n;i++){
            C[i]=(A[i]*B[i])%mod;
        }
        FWT_xor(A,-1);FWT_xor(B,-1);
        FWT_xor(C,-1);
        for(int i=0;i<n;i++){
            cout<<C[i]<<' ';
        }
        cout<<'
    ';
    
    }
  • 相关阅读:
    Linux三剑客之sed深度实践讲解(上)
    Linux第三阶段题型测试
    Linux正则表达式题型
    linux文本处理三剑客命令及用法
    SSH服务协议、部署ssh、scp、sftp服务
    NFS客户端挂载及永久生效
    SSH实现无密码登录
    NFS深度解析及搭建同步NFS服务
    NFS文件系统及搭建NFS共享服务
    Linux系统磁盘管理
  • 原文地址:https://www.cnblogs.com/liulex/p/11636490.html
Copyright © 2020-2023  润新知