首先考虑本题的$O(n^2)$做法。

$Part1$
对原序列从大到小排序后,考虑每个数字对最终答案的贡献,有第x个数字对答案的贡献十分难以计算,所以考虑计算数字x是集合第K大的方案数,作为数字x对$ans(K)$的贡献,然后对$ans$求前缀和,这样得到了x是集合第1~K大的对答案的贡献

$Part2$
考虑计算$ans(K)$只考虑子集合之中第K大的数的贡献,显然有
$$ ans(k) = \sum_{i=k}^n {C_{i-1}^{k-1}*2^{n-i}*a(i)} $$
( $a(i)$表示排序后的原序列 )
显然是一个卷积的形式。
$$ ans(k)*(k-1)! = \sum_{i=k}^n{\frac{1}{(i-k)!} * 2^{n-i}*a(i)*(i-1)! } $$
$A0(i) = 2^{n-i}*a(i)*(i-1)!$
$A(i) = A0(n-i)$
$B(i) = \frac{1}{i!} $
$C0(i) = ans(k)*(k-1)!*$
$C(i) = C0(n-i)$

$$ C(k) = \sum_{i=0}^{k}{A(i)*B(k-i)} $$
多项式乘法形式,用NTT或者FFT实现O(nlogn)

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define mod0 998244353
#define gn 3
#define N 400010
#define LL long long using namespace std; inline int mul(int a,int b,int P){
if(a*(LL)b<(LL)P) return a*b;
return (int)(a*(LL)b%(LL)P);
} inline int add(int a,int b,int P){
if(a+b>=P) return a+b-P;
return a+b;
} inline int qpow(int x,int n,int P){
int ans=;
for(;n;n>>=,x=mul(x,x,P))
if(n&) ans=mul(ans,x,P);
return ans;
} int wt[N],R[N]; void fnt(int *x,int n,int t,int P){
for(int i=;i<n;i++) if(i<R[i]) swap(x[i],x[R[i]]);
for(int m=;m<n;m<<=){
int wn=qpow(gn,(P-)/(m<<),P);
if(t==-) wn=qpow(wn,P-,P);
wt[]=;
for(int i=;i<m;i++) wt[i]=mul(wt[i-],wn,P);
for(int k=;k<n;k+=(m<<))
for(int i=;i<m;i++){
int &A=x[i+m+k];
int &B=x[i+k],t=mul(A,wt[i],P);
A=add(B,P-t,P); B=add(B,t,P);
}
}
if(t==-){
int tmp=qpow(n,P-,P);
for(int i=;i<n;i++) x[i]=mul(x[i],tmp,P);
}
} int n,m;
int a[N],b[N],c[N],ans[N],fac[N],a0[N]; void mulpoly(int P){
m=*n;
int L=,n;
for(n=;n<=m;n<<=) L++;
for(int i=;i<n;i++) R[i]=(R[i>>]>>)|((i&)<<(L-));
fnt(a,n,,P); fnt(b,n,,P);
for(int i=;i<n;i++) c[i]=mul(a[i],b[i],P);
fnt(c,n,-,P);
for(int i=;i<=n;i++) a[i]=b[i]=;
} bool cmp(int a,int b){
return a>b;
} int inv(int x,int P){
return qpow(x,P-,P);
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a0[i]);
sort(a0+,a0+n+,cmp);
fac[]=;
for(int i=;i<=n;i++) fac[i]=mul(fac[i-],i,mod0);
for(int i=;i<=n;i++){
a0[i]=mul(a0[i]%mod0,qpow(,n-i,mod0),mod0);
a0[i]=mul(a0[i],fac[i-],mod0);
}
for(int i=;i<=n;i++){
a[i]=a0[n-i];
b[i]=inv(fac[i],mod0);
}
mulpoly(mod0);
for(int i=;i<=n;i++) ans[i]=mul(c[n-i], inv(fac[i-],mod0),mod0);
for(int i=;i<=n;i++) ans[i] = add(ans[i],ans[i-],mod0);
for(int i=;i<=n;i++) printf("%d%c",ans[i],i==n?'\n':' ');
}
return ;
}

hdu5829 Rikka with Subset的更多相关文章

  1. HDU 6092`Rikka with Subset 01背包变形

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. HDU 6092 Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  3. HDU 6092 17多校5 Rikka with Subset(dp+思维)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  4. hdu 6092 Rikka with Subset(逆向01背包+思维)

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. 2017杭电多校第五场Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  7. Rikka with Subset HDU - 6092 (DP+组合数)

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  8. 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

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

随机推荐

  1. 使用Maven运行Java main的方法(转)

    使用Maven运行Java Main的方法(既Java Application项目),可以有如下方式解决: 1.将Maven项目导入到eclipse中,然后直接项目右键[Run As]->[Ja ...

  2. linux批量解压和批量压缩

    ls *.tar.gz | xargs -n1 tar xzvf //批量解压 ls | awk '{ print "tar zcvf "$0".tar.gz " ...

  3. EF使用自定义字符串连接数据库

    edmx的构造函数: public TestCheckUpdatesEntities(): base(Config.DataBaseConnectionString(), "TestChec ...

  4. SQL server创建和管理

    数据库函数的应用 数据库的查询方法 修改和替换数据库的数据

  5. iOS面试常见题

    1.耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13个人围坐一圈,从第一个人開始循环报数,数到三排除,最后剩下的人就是叛徒 int people[13] = {1,2,3, ...

  6. BingMap地图怎样显示中文

    这是bingMap的js引用 <script type="text/javascript" src="v=7.0&mkt=zh-cn'></sc ...

  7. [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作

    public void clickReportIcon(){ String initialWindowHandle = driver.getWindowHandle(); //保存原始的浏览器窗口 p ...

  8. 如何使用CSS3 @font-face

    @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许 ...

  9. node-orm2

    最近应老大要求,对orm2进行再一步封装,所以记录下封装和使用心得(文中数据库:mysql). 数据库连接 var orm = require("orm"); orm.connec ...

  10. BAPI_PO_CEATE 与PO_1