传送门

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. Shell教程 之传递参数

    1.Shell传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字, 0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数 ...

  2. 什么是PCM?它和.wav文件是什么关系?

    PCM(Pulse Code Modulation----脉码调制录音).所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录.PCM信号是由[1].[0]等符号构成的数字信号,而未经过任 ...

  3. js阻止时间冒泡事件——event.stopPropagation()

    1. 作用:不再派发事件. 2. 语法: html代码: <div class="oreder-cont" ng-click="Orderdetails()&quo ...

  4. 常用的key和oid

    1.FortiGate Template-Network-Office-Fortigate-Session Count:key,fgSysSesCount   oid,.1.3.6.1.4.1.123 ...

  5. swift 8.0之后打开 手机设置

    if #available(iOS 8.0, *){ if let url = URL(string: UIApplication.openSettingsURLString), UIApplicat ...

  6. linux服务器搭建

    centos7 java web项目环境搭配 2018年07月19日 17:20:21 阅读数:25 首先进行系统安装,此处不进行详细介绍,自行百度安装 一.配置ip地址信息 1.进入/etc/sys ...

  7. webpack(二) 根据模板生成简单的html文件

    (一)使用webpack 根据模板生成HTML,首先需要安装插件 html-webpack-plugin. 在工程文件夹安装插件 命令如下: npm install html-webpack-plug ...

  8. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  9. JS高级:事件冒泡和事件捕获;

    1.事件:浏览器客户端上客户触发的行为成为时事件:所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发 当用户触发一个事件时,浏览器的所有详细信息都存在一个叫做event的对象上,我们把它叫做 ...

  10. 定时器中的this和函数封装的简单理解;

    一.定时器中的this: 不管定时器中的函数怎么写,它里面的this都是window: 在函数前面讲this赋值给一个变量,函数内使用这个变量就可以改变this的指向 二.函数封装 函数封装是一种函数 ...