为什么这两种计数方式导致答案不同?
  • 板块CF1569C Jury Meeting
  • 楼主QVQ_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/15 15:28
  • 上次更新2024/8/15 17:23:15
查看原帖
为什么这两种计数方式导致答案不同?
1252807
QVQ_楼主2024/8/15 15:28

第一种:WA

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int N=2e5+5;
const int MOD=998244353;
int a[N],p[N];
 
bool cmp(int a,int b){
	return a>b;
}
int qpow(int a,int b){
	int ans=1;
	while(b>0){
		if(b&1) ans=ans*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return ans;
}
int inv(int x){
	return qpow(x,MOD-2);
}
void calc(){
	int n,mx=0,cnt=1,tot=1;scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(a[i]==a[i+1]) cnt++;
		else break;
	}
	/*for(int i=1;i<=n;i++){
		if(a[i]==a[1]) cnt++;
		else if(a[i]==a[2]) tot++;
	}*/
	if(cnt>1) printf("%lld\n",p[n]);
	else if(a[2]!=a[1]-1) printf("0\n");
	else{
		for(int i=2;i<=n;i++){
			if(a[i]==a[i+1]) tot++;
			else break;
		}
		int ans=1;
		ans=p[n]*tot%MOD*inv(tot+1)%MOD;
		printf("%lld\n",ans);
	}
}
signed main()
{
	//freopen("jury.in","r",stdin);freopen("jury.out","w",stdout);
	p[0]=1;
	for(int i=1;i<=2e5;i++) p[i]=p[i-1]*i%MOD;
	int T;scanf("%lld",&T);
	while(T--) calc();
	return 0;
}
/*
1
21
4 4 7 5 9 4 7 8 8 1 9 8 4 7 7 10 5 9 4 6 8
*/

第二种:AC

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int N=2e5+5;
const int MOD=998244353;
int a[N],p[N];
 
bool cmp(int a,int b){
	return a>b;
}
int qpow(int a,int b){
	int ans=1;
	while(b>0){
		if(b&1) ans=ans*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return ans;
}
int inv(int x){
	return qpow(x,MOD-2);
}
void calc(){
	int n,mx=0,cnt=0,tot=0;scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	sort(a+1,a+n+1,cmp);
	/*for(int i=1;i<=n;i++){
		if(a[i]==a[i+1]) cnt++;
		else break;
	}*/
	for(int i=1;i<=n;i++){
		if(a[i]==a[1]) cnt++;
		else if(a[i]==a[2]) tot++;
	}
	if(cnt>1) printf("%lld\n",p[n]);
	else if(a[2]!=a[1]-1) printf("0\n");
	else{
		/*for(int i=2;i<=n;i++){
			if(a[i]==a[i+1]) tot++;
			else break;
		}*/
		int ans=1;
		ans=p[n]*tot%MOD*inv(tot+1)%MOD;
		printf("%lld\n",ans);
	}
}
signed main()
{
	//freopen("jury.in","r",stdin);freopen("jury.out","w",stdout);
	p[0]=1;
	for(int i=1;i<=2e5;i++) p[i]=p[i-1]*i%MOD;
	int T;scanf("%lld",&T);
	while(T--) calc();
	return 0;
}
/*
21
4 4 7 5 9 4 7 8 8 1 9 8 4 7 7 10 5 9 4 6 8
*/
2024/8/15 15:28
加载中...