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 ...
随机推荐
- Linux下&/jobs/fg/bg命令的使用(转)
一.& 这个用在一个命令的最后,可以把这个命令放到后台执行. 二.[Ctrl]+[Z] 可以将一个正在前台执行的命令放到后台,并且暂停. 三.jobs 查看当前有多少在后台运行的命令. 四.f ...
- 教你如何在MySql中导入大小超过2M的数据库文件
我的个人实践是:phpmyadmin 导出 utf-8 的 insert 模式的 abc.sql ftp abc.sql 到服务器 ssh 到服务器 mysql -u abc -p use KKK(数 ...
- 使用ucontext组件实现的coroutine代码分析
coroutine一般翻译过来就是协程,类似于线程可以切换,而跟线程是由操作系统调度器来实现切换不一样,协程由用户程序自己调度进行切换.我以前也看过协程相关的内容,但没有自己去实现过.最近搞OpenS ...
- Cannot instantiate the type AppiumDriver,AppiumDriver升级引发的问题
转自:http://blog.csdn.net/zhubaitian/article/details/39717889 1. 问题描述和起因 在使用Appium1.7.0及其以下版本的时候,我们可以直 ...
- Python中文问题研究
我曾经在深入浅出java中文问题系 列中研究过java的中文问题,现在中文问题已经不再羁绊我在java世界中漫游的脚步了.最近,对Python产生了浓厚的兴趣,谁知道跟中文问题这个 老朋友又一次不期而 ...
- Marking as slave lost.
Spark on Yarn提交任务时报ClosedChannelException解决方案_服务器应用_Linux公社-Linux系统门户网站 http://www.linuxidc.com/Linu ...
- ORA-01031: insufficient privileges 解决办法
sysdba不能远程登录这个也是一个很常见的问题了. 碰到这样的问题我们该如何解决呢? 我们用sysdba登录的时候,用来管理我们的数据库实例,特别是有时候,服务器不再本台机器,这个就更是有必要了. ...
- socketIO原理图
- @class && #import
先前被问到@class和#import的区别,我很直白的说使用@class是对要引用的类进行一个声明,不让编译器报错,到后面要用的时候再引入相应的类,而#import则会引入类的所有实例变量和方法.接 ...
- iOS UI控件之间的关系图