HDU 5109 Alexandra and A*B Problem,hdu5109
題意:
給出數字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;}