Alexandra and A*B Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 804 Accepted Submission(s): 212
Problem Description
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.
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.
Input
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 .
A≤10,000,1≤|S|≤8 .
Output
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.
To C++ programmers: if you want to output 64-bit integers, please use "%I64d" specifier or cout.
Sample Input
6 8 96 19 2 0086 1 1
Sample Output
3 2 5043 1
给你A和S,找出最小的B满足条件
思路:刚看这题完全没思路...还是取模的题目做少了。
我们假设T=XsY X和Y分别是补在s前面和后面的一个串,设len为s的长度,len1为Y的长度
则T=(X*10^len+s)*10^len1+Y 由于A*B=T,所以有T%A==0 所以对于大于a的X和Y我们就可以通过取模减小0范围
这样X~[0,a) 当然如果s有前导0,X~[1,a),因为0相当于什么也不加。
当s==0的时候,直接输出0 任何数乘以0都为0
然后我们只要枚举X和len1就可以得到Y,然后就可以求出满足条件的最小的T
然后T/a即为最后的答案
注意因为Y~[0,a)所以len1范围为0~4 Y不一定是一个整数,可以形如0083
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
long long pow_(long long a,long long n)
{
long long ans=1;
while(n)
{
if(n&1) ans=ans*a;
a=a*a;
n>>=1;
}
return ans;
}
int main()
{
long long a;
char s[10];
while(~scanf("%lld",&a))
{
scanf("%s",s);
long long num=0,len=strlen(s);
for(int i=0; i<len; i++)
num=num*10+s[i]-'0';
int flag=0;
if(len>1&&s[0]=='0') flag=1;
if(len==1&&num==0) printf("0\n");
else
{
long long i=0,last_ans=-1;
if(flag) i=1;
for(; i<a; i++)
{
long long ans=i*pow_(10,len)+num;
for(long long j=1; j<=10000; j*=10)
{
long long mod=ans*j;
long long y=(a-mod%a)%a;
if(y<j)
{
mod+=y;
if(last_ans==-1) last_ans=mod;
else last_ans=min(last_ans,mod);
}
}
}
printf("%lld\n",last_ans/a);
}
}
return 0;
}