HDU 5109 Alexandra and A*B Problem,hdu5109

來源:互聯網
上載者:User

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;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.