首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。