Alexandra
has a little brother. He is new to programming. One day he is solving
the following problem: Given two positive integers A and B, output A*B.
This
problem is even easier than the last one. Alexandra can‘t wait to give
him another task: Given a positive integer A and a string S(S only
contains numbers.), find the minimum positive integer B, such that S is a
substring of T, where T is the decimal notation of A*B.
See the sample for better understanding.
Note: S can contain leading zeros, but T can‘t.
There are multiple test cases (no more than 500). Each case contains a positive integer A and a string S.
A≤10,000,1≤|S|≤8.
For each case, output the required B. It is guaranteed that such B always exists.
To C++ programmers: if you want to output 64-bit integers, please use "%I64d" specifier or cout.
3
2
5043
1
题意:给出一个数字a,以及一个串s(lens<=8)找到一个最小的数字 b ,使得 s 是 a*b = t 的一个连续子序列.
题解:非常巧妙的题目。假设t = xsy , 那么我们可以写出表达式 t = (x*10^lens+s)*10^len+y ,又因为 t%a == 0 所以对于最小的 t 式子的每一部分,都可以对 a 取模,
所以我们可以知道 x<a ,因为如果 x >= a,我们可以通过取模操作让 x 变小, 然后如果s[0]==0,那么x的下限就是1,否则x的下限为 0,然后对于 10^len 我们也可以通过同样的道理知道 10^len<= a <= 10^4 ,然后我们化出:
设 k = (x*10^lens+s)*10^len
所以 (k+y)%a=0
y = (-k%a+a)%a (y<10^len)
所以通过枚举 x,10^len 得到最终的答案。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL a;
char s[20];
while(scanf("%lld%s",&a,s)!=EOF){
int len = strlen(s);
if(strcmp(s,"0")==0){
printf("0\n");
continue;
}
LL ls = 1,mid=0;
for(int i=0;i<len;i++) ls*=10;
for(int i=0;i<len;i++){
mid = mid*10+s[i]-‘0‘;
}
LL ans = -1;
for(LL i=1;i<=10000;i*=10){
for(LL j=(s[0]==‘0‘);j<a;j++){
LL t = (j*ls+mid)*i;
LL y = (a-t%a)%a;
if(y>=i) continue;
if(ans<0) ans = t+y;
else ans = min(t+y,ans);
}
}
printf("%I64d\n",ans/a);
}
return 0;
}