题意:
给出数字a(<=10^4)和字符串s(|s|<=8) 求最小的b 使得a*b=t t的子串包含s
思路:
可以构造t为 XsY 假设 |Y|=ly |s|=ls 则 t = ( X * 10^ls + s ) * 10^ly +Y
这时t%a==0 这时未知数有 X Y ly 我们可以通过枚举两个计算一个的方式达到枚举所有解的目的
考虑X的范围 我们发现构造的基础是t%a==0 也就是说我们可以只关心“取模”!! 那么X一定在0~a-1之间(这里要特判 如果s以0开头则是1~a-1 这里还要特判 - -b 如果s就是0 那么直接输出0就好了…) 因为a和0对a取模是一样的
这时我们枚举的X最多10^4个 考虑到ly一定比Y小 所以枚举ly 计算Y的方法就是
mod = ( X * 10^ls + s ) * 10^ly % a
Y = ( a - mod ) % a
那么ly有多大?? 明显Y比a小 也就是说ly只有4 所以枚举最多40000次
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long LL;
int a;
LL s, b, t;
char str[10];
int main() {
while (~scanf("%d%s", &a, str)) {
int len = strlen(str);
if (len == 1 && str[0] == '0') {
puts("0");
continue;
}
b = -1;
LL base = 1;
for (int i = 1; i <= len; i++)
base *= 10;
sscanf(str, "%I64d", &s);
for (int i = 1; i <= 10000; i *= 10) {
for (int j = (str[0] == '0'); j < a; j++) {
t = ((LL) (j) * base + s) * i;
int mod = (a - t % a) % a;
if (mod < i) {
t += mod;
if (b < 0 || t < b)
b = t;
}
}
}
printf("%I64d\n", b / a);
}
return 0;
}