注意c的n次方可能很大,即使我们设定一个if语句去限制暴力范围,但是也可能某次c的n次方直接超出范围得到负值,从而WA.所以我们呢只能在n较小的时候暴力。由于2的62次方就已经接近1e18了,而ai最大才1e9,显然,当n大于62时,c=1显然时最优解。对于n小于62这个范围内我们再次暴力就不会存在越界的问题。
AC代码:
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int qmi(int a,int k) {
int ans=1;
while(k) {
if(k&1)ans=ans*a;
k>>=1;
a=a*a;
//cout<<k<<endl;
}
if(a==0)return 0;
else return ans;
}
main() {
IOS;
int n;
cin>>n;
int ans=0;
for(int i=0; i<n; i++) {
cin>>a[i];
ans+=abs(a[i]-1);
}
sort(a,a+n);
int maxx=0;
if(n<=62)for(int i=1; i<=1e6; i++) {
if(qmi(i,n-1)>=1e15||qmi(i,n-1)<0)break;
maxx=abs(a[0]-1);
for(int j=1; j<n; j++) {
maxx+=abs(a[j]-qmi(i,j));
}
ans=min(ans,maxx);
}
cout<<ans<<endl;
}