数螃蟹

题目链接:数螃蟹


感觉大家的做法似乎都很复杂。

其实有一个简单的做法,因为只有3个数字不一样,那么我们随机取两个数字,取到合法的数字概率为:(n-3)/n。

当n很大时,这个概率是很高的。

计算过程中会爆LL,所以我们用int128即可。

然后暴力check即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int __int128
using namespace std;
mt19937 rnd(time(0));
const int N=1e5+10;
int n,a[N],b[N];
#define gc() getchar()
inline int read(){
    int x=0,f=1; char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
    return x*f;
}
void write(int x){
	if(x<0)	putchar('-'),x=-x;
	if(x>9)	write(x/10); putchar('0'+x%10);
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)	a[i]=read();
	while(true){
		int l=rnd()%n+1,r=rnd()%n+1;
		if(l==r)	continue;	if(l>r)	swap(l,r);
		if((a[r]-a[l])%(r-l)!=0)	continue;
		int cnt=0,d=(a[r]-a[l])/(r-l);
		for(int i=1;i<=l;i++){b[i]=a[l]-(l-i)*d; if(a[i]+(l-i)*d!=a[l])	cnt++;}
		for(int i=l+1;i<=r;i++){b[i]=a[l]+(i-l)*d; if(a[i]!=a[l]+(i-l)*d)	cnt++;}
		for(int i=r+1;i<=n;i++){b[i]=a[r]+(i-r)*d;	if(a[i]!=a[r]+(i-r)*d)	cnt++;}
		if(cnt<=3)	break;
	}
	for(int i=1;i<=n;i++)	write(b[i]),putchar(' ');
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章