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;
}


浙公网安备 33010602011771号