zoukankan      html  css  js  c++  java
  • P4717 【模板】快速沃尔什变换

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

    链接

    分析:

      快速沃尔什变换模板题。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cctype>
    #include<set>
    #include<queue>
    #include<vector>
    #include<map>
    #include<bitset>
    using namespace std;
    typedef long long LL;
    
    inline int read() {
        int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
        for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
    }
    
    const int mod = 998244353, inv2 = 499122177, N = 131075;
    int A[N], B[N], C[N], ta[N], tb[N];
    
    inline int add(int x,int y) {
        x += y;
        return x < 0 ? x + mod : (x >= mod ? x - mod : x);
    }
    inline int mul(int x,int y) { return 1ll * x * y % mod; }
    void fwtxor(int *a,int len,int ty) {
        for (int m = 2; m <= len; m <<=1) 
            for (int i = 0; i < len; i += m) 
                for (int k = 0; k < (m >> 1); ++k) {
                    int x = a[i + k], y = a[i + k + (m >> 1)];
                    if (ty == 1) a[i + k] = add(x, y), a[i + k + (m >> 1)] = add(x, -y);
                    else a[i + k] = mul(add(x, y), inv2), a[i + k + (m >> 1)] = mul(add(x, -y), inv2);
                }
    }
    void fwtor(int *a,int len,int ty) {
        for (int m = 2; m <= len; m <<= 1) 
            for (int i = 0; i < len; i += m)
                for (int k = 0; k < (m >> 1); ++k) 
                    a[i + k + (m >> 1)] = add(ty * a[i + k], a[i + k + (m >> 1)]);
    }
    void fwtand(int *a,int len,int ty) {
        for (int m = 2; m <= len; m <<= 1) 
            for (int i = 0; i < len; i += m)
                for (int k = 0; k < (m >> 1); ++k)
                    a[i    + k] = add(a[i + k], ty * a[i + k + (m >> 1)]);
    }
    int main() {
        int n = 1 << read();
        for (int i = 0; i < n; ++i) A[i] = ta[i] = read();
        for (int i = 0; i < n; ++i) B[i] = tb[i] = read();
        fwtor(A, n, 1); fwtor(B, n, 1);
        for (int i = 0; i < n; ++i) C[i] = mul(A[i], B[i]);
        fwtor(C, n, -1);
        for (int i = 0; i < n; ++i) printf("%d ",C[i]); puts("");
    //    fwtor(A, n, -1); fwtor(B, n, -1);
        
        memcpy(A, ta, sizeof ta); memcpy(B, tb, sizeof tb);
        fwtand(A, n, 1); fwtand(B, n, 1);
        for (int i = 0; i < n; ++i) C[i] = mul(A[i], B[i]);
        fwtand(C, n, -1);
        for (int i = 0; i < n; ++i) printf("%d ",C[i]); puts("");
    //    fwtand(A, n, -1); fwtand(B, n, -1);
        
        memcpy(A, ta, sizeof ta); memcpy(B, tb, sizeof tb);
        fwtxor(A, n, 1); fwtxor(B, n, 1);
        for (int i = 0; i < n; ++i) C[i] = mul(A[i], B[i]);
        fwtxor(C, n, -1);
        for (int i = 0; i < n; ++i) printf("%d ",C[i]);
        return 0;
    }
  • 相关阅读:
    创建一个对象,包含有多个成绩,每个属性是一个成绩,遍历对象中的属性,计算出总成绩。
    创建一个计算器的函数calc含有两个数字,调用函数的函数传递一个函数,分别是实现加减乘除
    JS中的对象
    python+jieba+tfidf算法 文本相似度
    ubuntu hadoop2.x 伪分布部署及集群搭建(完全分布式)
    ubuntu16.04 +Java8+ hadoop2.x单机安装
    python pandas库的一些使用总结
    scrapy 当当网书籍信息爬取存储MySQL
    pymysql 中总结出来的一些问题
    python3 requests 12306下单环节
  • 原文地址:https://www.cnblogs.com/mjtcn/p/10569905.html
Copyright © 2011-2022 走看看