2018.11.17 hdu5829Rikka with Subset(ntt)
传送门
nttnttntt基础题。
考虑计算每一个数在排名为kkk时被统计了多少次来更新答案。
这样的话,设anskans_kansk表示所有数的值乘上排名为kkk的子集数的总和。
则ansk=∑i=knai(i−1k−1)2n−ians_k=\sum_{i=k}^na_i\binom{i-1}{k-1}2^{n-i}ansk=∑i=knai(k−1i−1)2n−i
=>ansk=1(k−1)!∑i=knai(i−1)!(i−k)!2n−ians_k=\frac1{(k-1)!}\sum_{i=k}^na_i\frac{(i-1)!}{(i-k)!}2^{n-i}ansk=(k−1)!1∑i=knai(i−k)!(i−1)!2n−i
=>ansk=1(k−1)!2k∑i=0n−kai+k(i+k−1)!2n−ii!ans_k=\frac1{(k-1)!2^k}\sum_{i=0}^{n-k}a_{i+k}(i+k-1)!\frac{2^{n-i}}{i!}ansk=(k−1)!2k1∑i=0n−kai+k(i+k−1)!i!2n−i
然后令xi=2n−ii!,yi=ai(i−1)!x_i=\frac{2^{n-i}}{i!},y_i=a_i(i-1)!xi=i!2n−i,yi=ai(i−1)!
那么将yyy数组翻转再平移一下就可以卷积了。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const int N=4e5+5,mod=998244353;
int tim,lim,n,a[N],b[N],fac[N],ifac[N],pos[N],pow2[N],num[N];
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline void prepare(){
ifac[0]=ifac[1]=fac[0]=fac[1]=1,pow2[0]=1;
for(ri i=1;i<=1e5;++i)pow2[i]=(ll)pow2[i-1]*2%mod;
for(ri i=2;i<=1e5;++i)ifac[i]=(ll)ifac[mod%i]*(mod-mod/i)%mod,fac[i]=(ll)fac[i-1]*i%mod;
for(ri i=2;i<=1e5;++i)ifac[i]=(ll)ifac[i-1]*ifac[i]%mod;
}
inline void init(){
lim=1,tim=0;
while(lim<=n*2)lim<<=1,++tim;
for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
inline void ntt(int *a,int type){
for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
int typ=type==1?3:(mod+1)/3,mult=(mod-1)>>1;
for(ri mid=1,wn;mid<lim;mid<<=1,mult>>=1){
wn=ksm(typ,mult);
for(ri j=0,len=mid<<1;j<lim;j+=len){
for(ri k=0,w=1;k<mid;++k,w=(ll)w*wn%mod){
int a0=a[j+k],a1=(ll)a[j+k+mid]*w%mod;
a[j+k]=(a0+a1)%mod,a[j+k+mid]=(a0-a1+mod)%mod;
}
}
}
if(type==-1){
int inv=ksm(lim,mod-2);
for(ri i=0;i<lim;++i)a[i]=(ll)a[i]*inv%mod;
}
}
int main(){
prepare();
for(int tt=read();tt;--tt,puts("")){
n=read(),init();
for(ri i=1;i<=n;++i)num[i]=read();
sort(num+1,num+n+1),reverse(num+1,num+n+1);
for(ri i=0;i<n;++i)a[i]=(ll)ifac[i]*pow2[n-i]%mod;
for(ri i=1;i<=n;++i)b[i]=(ll)fac[i-1]*num[i]%mod;
reverse(b+1,b+n+1);
for(ri i=0;i<n;++i)b[i]=b[i+1];
b[n]=0;
ntt(a,1),ntt(b,1);
for(ri i=0;i<lim;++i)a[i]=(ll)a[i]*b[i]%mod;
ntt(a,-1);
for(ri inv=(mod+1)/2,ans=0,last=0,i=1;i<=n;++i){
ans=((ll)inv*ifac[i-1]%mod*a[n-i]%mod+last)%mod;
printf("%d ",last=ans);
inv=(ll)inv*(mod+1)/2%mod;
}
memset(num,0,sizeof(num)),memset(a,0,sizeof(a)),memset(b,0,sizeof(b));
}
return 0;
}
2018.11.17 hdu5829Rikka with Subset(ntt)的更多相关文章
- 2018.11.16 bzoj4827: [Hnoi2017]礼物(ntt)
传送门 nttnttntt 入门题. 考虑展开要求的式子∑i=0n−1(xi−yi−c)2\sum_{i=0}^{n-1}(x_i-y_i-c)^2∑i=0n−1(xi−yi−c)2 => ...
- 2018.11.16javascript课上随笔(DOM)
<li> <a href = "“#”>-</a> </li> <li>子节点:文本节点(回车),元素节点,文本节点. 不同节点树 ...
- HDU - 5829:Rikka with Subset (NTT)
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...
- HDU 5829 Rikka with Subset(NTT)
题意 给定 \(n\) 个数 \(a_1,a_2,\cdots a_n\),对于每个 \(K\in[1,n]\) ,求出 \(n\) 个数的每个子集的前 \(K\) 大数的和,输出每个值,对 \(99 ...
- 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)
传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...
- 2018.11.01 NOIP训练 梭哈(模拟)
传送门 这题貌似不考智商啊. 直接按题意写就可以了. 事实上把牌从小到大排序之后写起来很舒服的. 然后就是有些地方可以人脑减代码量和判断次数. (提示:满堂红和某几种同类型的牌的大小判断) 然后注意A ...
- 2018.12.17 ural1132 Square Root(二次剩余)
传送门 MD写一道二次剩余的板题差点写自闭了. 我用的是cipollacipollacipolla算法. 利用的是欧拉准则来找寻一个二次非剩余类来求根. 注意这题有两个等根和模数为2的情况. 代码: ...
- 2018.11.07 NOIP模拟 数独(模拟)
传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码
- 2018.09.17 atcoder Digit Sum(数论)
传送门 数论好题啊. 首先对于b<=sqrt(n)b<=sqrt(n)b<=sqrt(n)的情况直接枚举b判断一下就行了. 下面谈一谈如何解决b>sqrt(n)b>sqr ...
随机推荐
- JS获取鼠标左(右)滑事件
鼠标左(右)滑也是网站开发中常见的效果之一,这里对鼠标左(右)滑做出一些解释. 首先要获取需要左右滑事件的节点: eg: var div=document.getElementById("d ...
- 大数据入门推荐 - 数据之巅 大数据革命,历史、现实与未来等五本PDF
扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com/联系店主
- Codeforces Beta Round #22 (Div. 2 Only)
Codeforces Beta Round #22 (Div. 2 Only) http://codeforces.com/contest/22 A 水题 #include<bits/stdc+ ...
- WINDOWS内核版本
Windows NT (NT=new technology) WOW64(Windows-on-Windows 64bit) 如何获取Windows 内核版本 1. cmd (win+r) 2. V ...
- vue params和query传参区别
参考地址:https://blog.csdn.net/bluefish_flying/article/details/81011230 router.js中 路由设置这里, 当你使用params方法传 ...
- 【Android端 adb相关】adb相关总结
一.什么是adb? adb的全称是:Android Debug Bridge,adb命令的构成是三部分,分别是:服务器.客户端.后台程序: (1)客户端:一个在PC上运行的客户端.可以通过shell端 ...
- [剑指Offer]42-连续子数组的最大和(DP)
题目链接 https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&t ...
- cipher的各个模式
block cipher 工作模式(引自百度)Electronic Codebook Mode 最经典的模式,把明文按64比特为单位分为block, 对所有block使用同样的密钥来加密,最后把输出的 ...
- iOS 开发实用工具
史蒂芬的博客 (各种软件) http://www.sdifen.com/ 产品原型设计工具 -- 1.墨刀 2.Axure RP 检测接口工具 ---- 1.Charles 2. postman607 ...
- day 17 re模块
RE模块 import re 对一个大篇幅的字符串,按照你的规则找出想要的字符串 # 单个字符匹配 import re # \w 与 \W #字母数字下划线, 非 # print(re.findall ...