題目鏈接:數螃蟹
感覺大家的做法似乎都很複雜。
其實有一個簡單的做法,因爲只有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;
}