首页 > 代码库 > HDU 5109 Alexandra and A*B Problem

HDU 5109 Alexandra and A*B Problem

题意:

给出数字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;
}


HDU 5109 Alexandra and A*B Problem