传送门

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. http://ctf.bugku.com/challenges#Easy_Re

      今天做一道逆向题,开心,见证了自己汇编的用途.     首先看它是否加壳? 1.加壳检测   是vc编程的,没有加壳,可以愉快地分析了.   2.分析程序,找到flag.   首先运行一下子程序, ...

  2. Codeforces Beta Round #40 (Div. 2)

    Codeforces Beta Round #40 (Div. 2) http://codeforces.com/contest/41 A #include<bits/stdc++.h> ...

  3. 关于客户端调用后台事件__doPostBack函数的使用

    1.   动态添加生成的控件:Asp.net开发网站,最喜欢用的就是使用服务器控件,在后台进行数据操作了,你无需再去管get还是post提交,也不用去理会form,只需在后台服务器控件的事件中就可以对 ...

  4. TZOJ 4325 RMQ with Shifts(线段树查询最小,暴力更新)

    描述 In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each que ...

  5. java Scanner类注意事项

    1,循环或递归调用获取数字时,不能用hasNextInt()判断是否有输入,不然会陷入死循环,应该用hasNext().获取也不能用nextInt(),应用next(),否则也会死循环 例如这段代码, ...

  6. go语言中的反射reflect

    package main; import ( "fmt" "reflect" ) //反射refection //反射使用TypeOf和ValueOf函数从接口 ...

  7. [z]分区truncate操作的介绍及对全局索引和空间释放影响的案例解析

    [z]https://www.2cto.com/database/201301/181226.html 环境: [sql] [oracle@localhost ~]$ uname -r 2.6.18- ...

  8. vue slot插槽的使用方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. PAT 1066 图像过滤(15)(代码)

    1066 图像过滤(15 分) 图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来.现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换. 输入格式: ...

  10. PAT 甲级1001 A+B Format (20)(C++ -思路)

    1001 A+B Format (20)(20 分) Calculate a + b and output the sum in standard format -- that is, the dig ...