给定一个整数(K).求一个(K)的整数倍(SUM),使得(SUM)的数位累加和最小
纪念(ATcoder) 神题(Orz)
考虑数位取模,(*10)贡献为(0),(+1)贡献为(1)。
跑一个同余最短路,在((mod K))意义下建图,(i)向(i+1)连一条边权为(1)的边,(i)向(10i)连一条边权为(0)的边,最短路的意义就是产生一个能整除(K)的正整数在数位上所需的最小代价
边权只有(0)和(1) (01BFS)
注意优先把贡献为(0)扔到队头,保证每次从队首取出来的是当前队中距离源点最短的节点
(O(n+m))
struct node{int num,w;};
deque<node>q; int K;
bool v[N];
void bfs(){
while(!q.empty()){
node x = q.front(); q.pop_front();
if(v[x.num]) continue;
v[x.num] = 1;
if(!x.num){ printf("%d",x.w); return ; }
q.push_front((node){x.num*10 % K,x.w});
q.push_back((node){(x.num+1) % K,x.w + 1});
}
}
int main(){
scanf("%d",&K);
q.push_front((node){1,1});
bfs();
}