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 @   小饼卷大葱  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示