CF1725

A Accumulation of Dominoes

特判一下m=1的情况就行

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	if(m==1) cout<<n-1;
	else cout<<(m-1)*n;
	return 0;
}

B Basketball Together

直接贪心每回最大和最小匹配

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,d;
const int maxn=1e5+5;
int p[maxn];
int divv(int x,int y){
	if(x<=0) return 0;
	if(x<y) return 1;
	return x/y+(bool)(x%y);
}
signed main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>d;
	for(int i=1;i<=n;i++) cin>>p[i];
	sort(p+1,p+1+n);
//	for(int i=1;i<=n;i++) cout<<p[i]<<" ";
	cout<<'\n'; 
	int l=1,r=n;
	int ans=0; 
	while(1){
//		cout<<l<<" "<<r<<" "<<divv(d-p[r]+1,p[r])<<'\n';
		if(r<=0) break;
		if((r-l+1)*(p[r])<d) break;
		if(l+divv(d-p[r]+1,p[r])-1>=r) break;
		ans++;
		l+=divv(d-p[r]+1,p[r]);
		r--;
	}
	cout<<ans;
	return 0;
}

C Circular Mirror

碰到方案数就一脸懵
考虑枚举有多少对相同颜色的连线过圆心的点对
设有k对
\(ans=\sum_{i=0}^{k} C_{k}^{i}*C_{m}^{i}*i!*{m-i}^{k-i}*{m-i-1}^{k-i}*{m-i}^{n-k*2}\)

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int mod=998244353;
int n,m;
const int maxn=3e5+5;
int sum[maxn];
int d[maxn];
int inv[maxn];
int ifac[maxn];
int frac[maxn];
void init(){
	frac[0]=frac[1]=inv[0]=inv[1]=ifac[0]=ifac[1]=1;
	for(int i=2;i<maxn;i++){
		frac[i]=frac[i-1]*i%mod;
		inv[i]=(mod-mod/i)*inv[mod%i]%mod;
		ifac[i]=ifac[i-1]*inv[i]%mod;
	}
}
int c(int x,int y){
	return frac[x]*ifac[x-y]%mod*ifac[y]%mod;
}
int tot;
int ksm(int x,int kk){
	int base=x;
	int ans=1;
	while(kk){
		if(kk&1) ans=ans*base%mod;
		base=base*base%mod;
		kk>>=1;
	}

	return ans;
}
signed main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	init();
	for(int i=1;i<=n;i++){
		cin>>d[i];
		sum[i]=sum[i-1]+d[i];
	}
	if(sum[n]&1){
		cout<<ksm(m,n)<<'\n';
		exit(0);
	}
	int k=0;
	int j=1;
	for(int i=1;i<=n;i++){
		while(j<=n&&sum[j]-sum[i]<sum[n]/2) j++;
		if(sum[j]-sum[i]==sum[n]/2) k++;
	}
	int ans=0;
	for(int i=0;i<=k;i++){
		ans=(ans+c(k,i)*c(m,i)%mod*frac[i]%mod*ksm(m-i,n-k*2)%mod*ksm(m-i,k-i)%mod*ksm(m-i-1,k-i)%mod)%mod;
//		cout<<c(k,i)<<" "<<c(m,i)<<" "<<<<'\n';
	}
	cout<<ans;
	return 0;
}

posted @ 2023-11-01 22:51  jt0007  阅读(226)  评论(0)    收藏  举报