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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)