题意:
给出数字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; }
时间: 2024-10-14 21:58:19