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 ...
随机推荐
- 临远的spring security教程
为啥选择Spring Security 欢迎阅读咱们写的Spring Security教程,咱们既不想写一个简单的入门教程,也不想翻译已有的国外教程.咱们这个教程就是建立在咱们自己做的OA的基础上,一 ...
- BUPT复试专题—字符串处理(2016)
题目描述 有以下三种操作. (1)COPY l r(0<=l<=r<n),n代表s串的长度.这个表示将s串从l到r的序列复制到剪贴板t里面,覆盖t字符串. 例如s为abcde ...
- [Testing] Static Analysis Testing JavaScript Applications
The static code analysis and linting tool ESLint is the de-facto standard for linting JavaScript pro ...
- 【LeetCode】Generate Parentheses 解题报告
[题目] Given n pairs of parentheses, write a function to generate all combinations of well-formed pare ...
- 仿MIUI音量变化环形进度条实现
Android中使用环形进度条的业务场景事实上蛮多的,比方下载文件的时候使用环形进度条.会给用户眼前一亮的感觉:再比方我大爱的MIUI系统,它的音量进度条就是使用环形进度条,尽显小米"为发烧 ...
- android 文件读取(assets)
assets文件夹资源的访问 assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件. 1. 先在Activity里面调用g ...
- Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方式
Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...
- k进制正整数的对k-1取余与按位取余
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/24 先说一下结论 有k进制数abcd,有abcd%(k−1)=(a+b+c+d)%(k−1) 这是由于kn=((k−1)+1)n=∑ ...
- SQLDMO注冊
在维护人事系统时.师姐给我们提出一个功能上有问题. 备份数据库时.报黄页.然后须要我们寻找原因,作出解决方式. 一開始我从原先在本机上公布的系统入手,发现没有出现故障.可是.当对程序进行调试时,就出现 ...
- MeiTuanLocateCity
https://github.com/eltld/MeiTuanLocateCity