传送门

首先把权值化作下标
首先显然是要求∏(1+xai)\prod(1+x^{a_i})∏(1+xai​)一样的东西
这里的乘法是kkk进制不进位加法卷积

显然是做fwtfwtfwt
由于998244353998244353998244353没有w5,w6w_5,w_6w5​,w6​
手动扩域即可
考虑加起来做fwtfwtfwt,然后再还原乘起来的fwtfwtfwt点值
考虑高维dftdftdft时是一维一维的做
每一次都是乘wijw^{ij}wij
一个位置aaa对bbb的贡献是
w∑ai∗biw^{\sum a_i*b_i}w∑ai​∗bi​
由于是(1+xi)(1+x^i)(1+xi)
所以最后一定是(1+wkp)(1+w_k^p)(1+wkp​)的形式
那么如果只把(xai)(x^{a_i})(xai​)加起来做fwtfwtfwt
最后一个位置xxx有fx,tf_{x,t}fx,t​个wktw_k^twkt​
就是说实际是(1+wkt)fx,t(1+w_k^t)^{f_{x,t}}(1+wkt​)fx,t​
全部乘起来在idwtidwtidwt回去即可

不用光速幂跑不过去。。。

#include<bits/stdc++.h>
using namespace std;
#define cs const
#define re register
#define pb push_back
#define pii pair<int,int>
#define fi first
#define ll long long
#define se second
#define bg begin
cs int RLEN=(1<<20)+1;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(int bas=10){char ch=gc();int res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=res*bas+(ch^48),ch=gc();return f?res:-res;
}
template<class tp>inline void chemx(tp&a,tp b){a<b?a=b:0;}
template<class tp>inline void chemn(tp&a,tp b){a>b?a=b:0;}
cs int mod=998244353;
inline int add(int a,int b){return (a+=b)>=mod?(a-mod):a;}
inline int dec(int a,int b){a-=b;return a+(a>>31&mod);}
inline int mul(int a,int b){static ll r;r=1ll*a*b;return (r>=mod)?(r%mod):r;}
inline void Add(int &a,int b){(a+=b)>=mod?(a-=mod):0;}
inline void Dec(int &a,int b){a-=b,a+=a>>31&mod;}
inline void Mul(int &a,int b){static ll r;r=1ll*a*b,a=(r>=mod)?(r%mod):r;}
inline int ksm(int a,int b,int res=1){for(;b;b>>=1,Mul(a,a))(b&1)&&(Mul(res,a),1);return res;}
inline int Inv(int x){return ksm(x,mod-2);}
inline int fix(int x){return (x<0)?(x+mod):x;}
int tmp[12],k,n,m,lim;
cs int N=80000;
struct plx{int a[6];plx(){a[0]=a[1]=a[2]=a[3]=a[4]=a[5]=0;}inline int &operator [](cs int &i){return a[i];}inline cs int &operator [](cs int &i)cs{return a[i];}friend inline plx operator +(plx a,plx b){for(int i=0;i<k;i++)Add(a[i],b[i]);return a;}friend inline plx operator -(plx a,plx b){for(int i=0;i<k;i++)Dec(a[i],b[i]);return a;}friend inline plx operator *(plx a,plx b){for(int i=0;i<k;i++)if(a[i])for(int j=0;j<k;j++)Add(tmp[i+j],mul(a[i],b[j]));for(int i=0;i<k;i++)a[i]=add(tmp[i],tmp[i+k]),tmp[i]=tmp[i+k]=0;return a;}inline int ans(){if(k==5)return dec(a[0],a[1]);else return add(dec(a[0],a[3]),mul(dec(add(a[1],a[5]),add(a[2],a[4])),Inv(2)));}
}tp[6],f[N],w[6],pw1[6][1001],pw2[6][1001],I;
inline void init_w(){for(int i=0;i<k;i++)w[i][i]=1;for(int i=0;i<k;i++){pw1[i][0]=pw2[i][0]=w[0];pw1[i][1]=I+w[i];for(int j=2;j<=1000;j++)pw1[i][j]=pw1[i][j-1]*pw1[i][1];pw2[i][1]=pw1[i][1000];for(int j=2;j<=1000;j++)pw2[i][j]=pw2[i][j-1]*pw2[i][1];}
}
inline void dwt(plx *f,int lim){for(int mid=1;mid<lim;mid*=k)for(int i=0;i<lim;i+=mid*k)for(int j=0;j<mid;j++){for(int l=0;l<k;l++)tp[l]=f[i+l*mid+j];for(int p=0;p<k;p++){int ps=i+p*mid+j;f[ps]=plx();for(int l=0;l<k;l++)f[ps]=f[ps]+w[l*p%k]*tp[l];}}
}
inline void idwt(plx *f,int lim){for(int mid=1;mid<lim;mid*=k)for(int i=0;i<lim;i+=mid*k)for(int j=0;j<mid;j++){for(int l=0;l<k;l++)tp[l]=f[i+l*mid+j];for(int p=0;p<k;p++){int ps=i+p*mid+j;f[ps]=plx();for(int l=0,o;l<k;l++)o=l*p%k,f[ps]=f[ps]+w[o?(k-o):0]*tp[l];}}for(int i=0,iv=Inv(lim);i<lim;i++)for(int j=0;j<k;j++)Mul(f[i][j],iv);
}
inline plx pksm(plx a,int b){plx ret=I;for(;b;b>>=1,a=a*a)if(b&1)ret=ret*a;return ret;
}
inline plx get(plx x){plx ret=I;for(int i=0;i<k;i++){ret=ret*pw1[i][x[i]%1000]*pw2[i][x[i]/1000];}return ret;
}
int main(){#ifdef Stargazerfreopen("lx.cpp","r",stdin);freopen("my.out","w",stdout);#endifn=read(),k=read(),m=read();I[0]=1,lim=ksm(k,m),init_w();for(int i=1;i<=n;i++)f[read(k)][0]++;dwt(f,lim);for(int i=0;i<lim;i++)f[i]=get(f[i]);idwt(f,lim);int ret=0;for(int i=0;i<lim;i++)cout<<f[i].ans()<<'\n';//Add(ret,mul(mul(i,i),f[i].ans()));
}

【洛谷P5577】【CmdOI2019】算力训练(FWT)相关推荐

  1. 洛谷 P1618 STL全排列方法

    洛谷 P1618 & STL全排列方法 今天在做洛谷上暴力专项训练,在解P1618题目的过程中发现了STL中全排列在解题中的妙用,特在此分享. 首先让我们先来看一下这道题: P1618三连击( ...

  2. uoj#348/洛谷P4221 [WC2018]州区划分(FWT)

    传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...

  3. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

  4. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  5. 洛谷 【P1252】马拉松接力赛

    洛谷 [P1252]马拉松接力赛 题目描述 某城市冬季举办环城25km马拉松接力赛,每个代表队有5人参加比赛,比赛要求每个的每名参赛选手只能跑一次,一次至少跑1km.最多只能跑10km,而且每个选手所 ...

  6. 洛谷日报 2020年3月前索引

    2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...

  7. 洛谷日报索引(2020、2019、2018)

    历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https: ...

  8. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  9. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

最新文章

  1. 独家 | 机器学习模型应用方法综述
  2. 马库斯再批深度学习:20年毫无进展,无法处理语言复杂性
  3. NND年年回家这么难买火车票
  4. wxWidgets:wxLayoutAlgorithm类用法
  5. Scrayp-集成scrapy_redis和bloomfilter实现增量
  6. 使用mintty(_如何使用Mintty改善Cygwin控制台
  7. word的公式后加编码后自动变小
  8. Javascript中 != 和 !==的区别
  9. groupby java_Java流-在GroupBy之后获取内部元素
  10. 博弈论(一)基本概念
  11. 数据库SQL(基础代码)
  12. 实现背景轮播登录页面
  13. loadrunner Lr_类函数之 lr_rendezvous()
  14. 关于严蔚敏老师《数据结构(C语言版)》书中代码的误解
  15. 星星城堡童装加盟雾非雾
  16. 职业作秀V1.7.9更新公告
  17. Magento后台添加商品属性集属性集详细教程
  18. android hook方法替换,Android Hook入门教程
  19. AngularJS的优缺点总结
  20. vscode 样式字体粗细颜色自定义

热门文章

  1. python封面是什么样子_Python的学习路线是怎么样的?
  2. 【每日启蒙】轻松学摄影之启蒙篇
  3. 工具类-httpClient工具类
  4. 针对LOGO的半透明图片的显示
  5. Matlab调用Cplex的二三事
  6. 智慧环保监测管理系统架构详情分析
  7. 网易互娱将星N计划空宣 要点速记
  8. 找工作(金证、中软)
  9. php采集节目单,电视节目预告
  10. 电视剧场节目管理系统 JAVA MySQL