數螃蟹

題目鏈接:數螃蟹


感覺大家的做法似乎都很複雜。

其實有一個簡單的做法,因爲只有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章