「PKUSC2018」真实排名 (简单组合数)

题面:「PKUSC2018」真实排名

题解

分类讨论,对于第 i 个人:

a_{i}不翻倍,则对于满足a_{j}<a_{i},a_{j}*2\geq a_{i}的任意 j ,第 j 个人必须不翻倍,否则第 i 个人的排名一定变,因为其他人无论翻不翻倍,对 i 的排名没有影响。设这样满足条件的 j 的数量为 m ,那么方案数就为组合数C_{n-m-1}^{k}

a_{i}翻倍,则对于满足a_{i}\leq a_{j}<a_{i}*2,j\neq i的任意 j ,第 j 个人必须翻倍,原因同理。设这样满足条件的 j 的数量为 p ,那么方案数就为组合数C_{n-p-1}^{k-p-1}

所以第 i 个人的总方案数为C_{n-m_{i}-1}^{k}+C_{n-p_{i}-1}^{k-p_{i}-1}

提示:代码中慎用快速乘!因为我把考试源代码删了快速乘就A了(QAQ)

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define ll long long
#define MAXN 100005
#define mod 998244353ll
using namespace std;
inline ll read(){
	ll x=0,f=1;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f*=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+s-'0';s=getchar();}
	return x*f;
}
int n,k;
struct itn{
	ll x;int y;
	itn(){}
	itn(ll X,int Y){x=X,y=Y;}
}a[MAXN];
ll jc[MAXN],ans[MAXN];
inline bool cmp(itn a,itn b){return a.x<b.x;}
inline ll ksm(ll a,ll b,ll mo){
	ll res=1;
	for(;b;b>>=1){
		if(b&1)res=res*a%mod;
		a=a*a%mod;
	}
	return res;
}
inline ll C(int n,int m){
	if(m>n||m<0)return 0;
	return jc[n]*ksm(jc[m],mod-2,mod)%mod*ksm(jc[n-m],mod-2,mod)%mod;
}
int main()
{
//	freopen("rank.in","r",stdin);
//	freopen("rank.out","w",stdout);
	n=read(),k=read(),jc[0]=1;
	for(int i=1;i<MAXN-4;i++)jc[i]=jc[i-1]*i%mod;
	for(int i=1;i<=n;i++)a[i]=itn(read(),i);
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		int id=i,t;
		for(int j=17,o=id-(1<<j);j>=0;j--,o=id-(1<<j))
			if(o>0&&a[o].x==a[id].x)id=o;
		t=id;
		for(int j=17,o=t-(1<<j);j>=0;j--,o=t-(1<<j))
			if(o>0&&(a[o].x<<1)>=a[id].x)t=o;
		ans[a[i].y]=C(n-id+t-1,k)%mod,t=id;
		for(int j=17,o=t+(1<<j);j>=0;j--,o=t+(1<<j))
			if(o<=n&&a[o].x<(a[id].x<<1))t=o;
		(ans[a[i].y]+=C(n-t+id-1,k-t+id-1)%mod)%=mod;
	}
	for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值