Question: Classement réel "PKUSC2018"
réponse
Discussion classée, pour la i-ème personne:
S'il n'est pas doublé, alors pour rencontrer l' un des j, j-ième individu ne doit pas être doublé, sinon les individus de rang i doivent changer, car les autres n'ont pas d'importance pour doubler, cela n'a aucun effet sur le classement de i. Supposons que le nombre de j qui satisfait la condition est m, alors le nombre de schémas est le nombre de combinaisons ;
S'il est doublé, alors pour tout j qui est satisfait , la j-ème personne doit doubler pour la même raison. Supposons que le nombre de j qui satisfait la condition soit p, alors le nombre de schémas est le nombre de combinaisons ;
Donc, le nombre total de plans pour la i-ème personne est .
Astuce: utilisez la multiplication rapide avec prudence dans le code! Parce que j'ai supprimé le code source du test, j'ai obtenu A (QAQ)
Code
#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;
}