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;
}
posted @ 2022-08-09 22:23  小饼卷大葱  阅读(19)  评论(0)    收藏  举报