1 条题解

  • 0
    @ 2026-6-1 16:19:03

    分类讨论

    1.不选xx>=x>\mathbf{=}x(注意等于的情况也是可以的)的和<x2<\frac x 2的都可以选

    2.选xx<x<x的和>2x>2x的随便选,[x,2x+1][x,2x+1]的必须选 二分一下 然后算一个组合数就行

    原题:P5368

    #include<bits/stdc++.h>
    #define int long long 
    #define big __int128
    #define pii pair<int,int>
    #define F first
    #define S second
    #define mkp make_pair 
    using namespace std;
    const int N=1e7,E=1e4;
    const int inf=1e15,mod=998244353;
    int n,m;
    pii p[101000];
    int jc[101000],nyjc[101000];
    int qpow(int x,int y){
    	int sum=1;
    	while(y){
    		if(y&1) sum=sum*x%mod;
    		x=x*x%mod;
    		y>>=1;
    	}return sum;
    } 
    map<int,int>mp; 
    int ans[101000];
    int Fnd(int x){
    	pii comp=mkp(x,inf);
    	int l=0,r=n;
    	while(l<r){
    		int mid=(l+r+1)/2;
    		if(p[mid]<=comp) l=mid;
    		else r=mid-1;
    	}return l;
    }
    int C(int x,int y){
    	if(y>x||y<0) return 0;
    	return jc[x]*nyjc[x-y]%mod*nyjc[y]%mod;
    }
    signed main() {
    	jc[0]=nyjc[0]=1;
    	for(int i=1;i<=100000;i++){
    		jc[i]=jc[i-1]*i%mod;
    		nyjc[i]=qpow(jc[i],mod-2);
    	}
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    //	freopen("ex.in","r",stdin);
    //	freopen("my.out","w",stdout);
    //	system("fc ex.out my.out");return 0;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		int x;
    		cin>>x;
    		p[i]=mkp(x,i);
    		mp[x]++;
    	}sort(p+1,p+n+1);
    	p[n+1].F=inf;
    	for(int i=1;i<=n;i++){
    			int cnt=n-Fnd(p[i].F)+Fnd((p[i].F-1)/2)+mp[p[i].F]-1;
    			ans[p[i].S]=C(cnt,m)*(p[i].F!=0);
    			cnt=Fnd(2*p[i].F-1)-Fnd(p[i].F-1);
    			ans[p[i].S]+=C(n-cnt,m-cnt);
    	}
    	for(int i=1;i<=n;i++){
    		cout<<ans[i]%mod<<"\n";
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    233
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    26
    已通过
    11
    上传者