[ABC077D] Small Multiple
Description#
给定一个整数 。求一个 的正整数倍 ,使得 的数位累加和最小。
。
Solution#
先不去考虑 的倍数这件事。思考如何快速得到一些数的数位累加和。
一个数的数位和,可以看成这个数在当前数位上加了几次。那么如果我们从 出发,那么就会有两条路:当前数位加一或者进入到下一个数位,其体现为 和 。而 会使数位和增加,但 不会。
但怎么找到 的倍数呢?我们从余数的角度来考虑。那么 和 就相当于从一个余数连向另一个余数的边, 边权值为 , 边权值为 。最终答案就为 到 的最短路。
Code#
#include<queue>
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int n,dis[N];
bool bj[N];
struct node {int x,dis;};
deque<node> q;
int main()
{
scanf("%d",&n);
memset(dis,0x3f3f3f3f,sizeof(dis));
q.push_back((node){1,1});dis[1]=1;
while (!q.empty())
{
int x=q.front().x,d=q.front().dis;q.pop_front();
if (dis[x]<d) continue;
if (bj[x]) continue;
bj[x]=true;
if (dis[(x+1)%n]>dis[x]+1)
{
dis[(x+1)%n]=dis[x]+1;
if (!bj[(x+1)%n]) q.push_back((node){(x+1)%n,dis[(x+1)%n]});
}
if (dis[x*10%n]>dis[x])
{
dis[x*10%n]=dis[x];
if (!bj[x*10%n]) q.push_front((node){x*10%n,dis[x*10%n]});
}
}
printf("%d\n",dis[0]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】