传送门

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=kn​ai​(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=kn​ai​(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−k​ai+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)的更多相关文章

  1. 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 => ...

  2. 2018.11.16javascript课上随笔(DOM)

    <li> <a href = "“#”>-</a> </li> <li>子节点:文本节点(回车),元素节点,文本节点. 不同节点树 ...

  3. 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 ...

  4. HDU 5829 Rikka with Subset(NTT)

    题意 给定 \(n\) 个数 \(a_1,a_2,\cdots a_n\),对于每个 \(K\in[1,n]\) ,求出 \(n\) 个数的每个子集的前 \(K\) 大数的和,输出每个值,对 \(99 ...

  5. 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)

    传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...

  6. 2018.11.01 NOIP训练 梭哈(模拟)

    传送门 这题貌似不考智商啊. 直接按题意写就可以了. 事实上把牌从小到大排序之后写起来很舒服的. 然后就是有些地方可以人脑减代码量和判断次数. (提示:满堂红和某几种同类型的牌的大小判断) 然后注意A ...

  7. 2018.12.17 ural1132 Square Root(二次剩余)

    传送门 MD写一道二次剩余的板题差点写自闭了. 我用的是cipollacipollacipolla算法. 利用的是欧拉准则来找寻一个二次非剩余类来求根. 注意这题有两个等根和模数为2的情况. 代码: ...

  8. 2018.11.07 NOIP模拟 数独(模拟)

    传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码

  9. 2018.09.17 atcoder Digit Sum(数论)

    传送门 数论好题啊. 首先对于b<=sqrt(n)b<=sqrt(n)b<=sqrt(n)的情况直接枚举b判断一下就行了. 下面谈一谈如何解决b>sqrt(n)b>sqr ...

随机推荐

  1. JS获取鼠标左(右)滑事件

    鼠标左(右)滑也是网站开发中常见的效果之一,这里对鼠标左(右)滑做出一些解释. 首先要获取需要左右滑事件的节点: eg: var div=document.getElementById("d ...

  2. 大数据入门推荐 - 数据之巅 大数据革命,历史、现实与未来等五本PDF

    扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com/联系店主

  3. Codeforces Beta Round #22 (Div. 2 Only)

    Codeforces Beta Round #22 (Div. 2 Only) http://codeforces.com/contest/22 A 水题 #include<bits/stdc+ ...

  4. WINDOWS内核版本

    Windows NT (NT=new technology)  WOW64(Windows-on-Windows 64bit) 如何获取Windows 内核版本 1. cmd (win+r) 2. V ...

  5. vue params和query传参区别

    参考地址:https://blog.csdn.net/bluefish_flying/article/details/81011230 router.js中 路由设置这里, 当你使用params方法传 ...

  6. 【Android端 adb相关】adb相关总结

    一.什么是adb? adb的全称是:Android Debug Bridge,adb命令的构成是三部分,分别是:服务器.客户端.后台程序: (1)客户端:一个在PC上运行的客户端.可以通过shell端 ...

  7. [剑指Offer]42-连续子数组的最大和(DP)

    题目链接 https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&t ...

  8. cipher的各个模式

    block cipher 工作模式(引自百度)Electronic Codebook Mode 最经典的模式,把明文按64比特为单位分为block, 对所有block使用同样的密钥来加密,最后把输出的 ...

  9. iOS 开发实用工具

    史蒂芬的博客 (各种软件) http://www.sdifen.com/ 产品原型设计工具 -- 1.墨刀 2.Axure RP 检测接口工具 ---- 1.Charles 2. postman607 ...

  10. day 17 re模块

    RE模块 import re 对一个大篇幅的字符串,按照你的规则找出想要的字符串 # 单个字符匹配 import re # \w 与 \W #字母数字下划线, 非 # print(re.findall ...