题目链接:Integer Divisibility - LightOJ 1078 - Virtual Judge (ppsucxtt.cn)
题意:给你一个n和m,问你至少多少个m组成的数mm……m可以被n整除。
一开始的想法就是暴力从小到大枚举,当然正解也就是暴力从小到大枚举,但是需要注意的一点时,我们枚举的过程中有可能会出现溢出现象,所以我们需要在过程中对ans取余n,下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int T;
cin>>T;
int n,m;
for(int o=1;o<=T;o++)
{
scanf("%d%d",&n,&m);
long long ans=m;
int cnt=1;
while(ans%n)
{
cnt++;
ans=ans*10+m;
ans%=n;
}
printf("Case %d: %d\n",o,cnt);
}
return 0;
}
下面我来说一下为什么过程中对n取余是不影响最终答案的,设当前ans=k*n+r,则ans*10+n=k*n*10+r*10+n,k*n*10一定是n的倍数,无论之后乘以多少他依旧是n的倍数,我们主要是想让后面的r*10+n也能够被n整除,是所以在过程中取模是不会影响最终答案的。