hdu5829 Rikka with Subset
首先考虑本题的$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的更多相关文章
- HDU 6092`Rikka with Subset 01背包变形
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 6092 Rikka with Subset
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 ...
- hdu 6092 Rikka with Subset(逆向01背包+思维)
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- Rikka with Subset
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 2017杭电多校第五场Rikka with Subset
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- Solidworks工程图如何使用,替换图纸格式模板文件
1 如果你有了图纸模板(SLDDRW文件),比如下面的这个文件,则以后把零件的三维图拖放到里面就可以了.注意,这是最简单,最有效的方法,后面另存为的slddrt文件不好使,所以还不如把模板文件另存为S ...
- Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读
Linux内核模块简单介绍 Linux内核的总体结构已经很庞大,而其包括的组件或许多.我们如何把须要的部分都包括在内核中呢?一种方法是把全部须要的功能都编译到Linux内核.这会导致两个问题.一是生成 ...
- java 短信猫发送短信的方法
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: · 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...
- 【翻译自mos文章】多租户中的service管理
来源于: Service Management For Multitenant (文档 ID 2009500.1) APPLIES TO: Oracle Database - Enterprise E ...
- NYOJ 1067 Compress String(区间dp)
Compress String 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描写叙述 One day,a beautiful girl ask LYH to help he ...
- device not managed by NetworkManager
Bringing up interface eth0:Error:Connection activation failed:Device not managed by NetworkManager ...
- Space for commit to queue couldn't be acquired
18/07/27 16:53:53 ERROR source.ExecSource: Failed while running command: tail -F /home/MyBgJavaLan/p ...
- db_create_file_dest
<span><span>RAC中.将db_create_file_dest改动为本地路径,在创建表空间指定ASM磁盘组的时候还能够直接'+DATA'么?</span> ...
- 利用WebViewJavascriptBridge与UIWebView进行交互
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- physical processor, core, logical processor
Processor Groups https://docs.microsoft.com/en-us/windows/desktop/ProcThread/processor-groups The 64 ...