1 条题解
-
0
分类讨论
1.不选 则(注意等于的情况也是可以的)的和的都可以选
2.选 则的和的随便选,的必须选 二分一下 然后算一个组合数就行
原题: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
- 上传者