hdu7106 Function
solution
枚举g(),然后二分
code
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define int long long
using namespace std;
const int _=1e6+7;
// const int mod=1e9+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int A,B,C,D,n;
int g(int x) {
int tot=0;
while(x) tot+=x%10,x/=10;
return tot;
}
int f(int x) {
return A*x*x*g(x)+B*x*x+C*x*g(x)*g(x)+D*x*g(x);
}
vector<int> num[60];
void solve() {
cin>>A>>B>>C>>D>>n;
int ans=f(1);
for(int i=1;i<=54;++i) {
int a=A*i+B;
int b=C*i*i+D*i;
//ax^2 + bx
int len=(int)num[i].size();
if(len==0) continue;
if(num[i][0]<=n) ans=min(ans,f(num[i][0]));
int x=lower_bound(num[i].begin(),num[i].end(),n)-num[i].begin();
for(int j=x-10;j<=x+10;++j) {
if(0<=j&&j<len&&num[i][j]<=n) ans=min(ans,f(num[i][j]));
}
if(a==0) continue;
int tmp=-b/(2ll*a);
if(tmp<0) continue;
int dsr=lower_bound(num[i].begin(),num[i].end(),tmp)-num[i].begin();
for(int j=dsr-10;j<=dsr+10;++j) {
if(0<=j&&j<len&&num[i][j]<=n) ans=min(ans,f(num[i][j]));
}
}
cout<<ans<<"\n";
}
signed main() {
#ifdef ONLINE_JUDGE
#else
freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
#endif
for(int i=1;i<=1000000;++i) {
num[g(i)].push_back(i);
}
for(int i=0;i<=54;++i) sort(num[i].begin(), num[i].end());
int T=read();
while(T--) {
solve();
}
return 0;
}