hdu 5109 Alexandra and A*B Problem

来源:互联网 发布:dota2数据查询 编辑:程序博客网 时间:2024/05/17 20:15

思路:做题的时候完全没思路。。。。看了题解才有。。。说说我的理解。。
串S是串T的子串,串T应该就是xSy的形式,x接在S前,y接在S后,构成了串T。A*B=T,设S的长度为p,y的长度为q,则A*B=(x*10^p+S)*10^q+y。
T%A=0,即((x*10^p+S)*10^q+y)%A=0,对于x的范围,可以通过取模运算缩小到[0~a),如果S的开头为0的话,则x的范围是[1~a-1],在这个范围内枚举x,然后枚举y的长度,就可以得到x和y,然后找到满足条件的最小的就好了。
T/A就是结果了
因为y也是在[0~a)这个范围,所以y的长度范围是0~4,y长度是0的时候,y<1,y长度是1的时候,y<10……….一直到y<10000,都是符合条件的y。

#include <cstdio>#include <cstring>typedef long long ll;char str[10];ll a;ll pow(ll a, ll b){    ll res = 1;    while(b)    {        if(b&1) res *= a;        a *= a;        b >>= 1;    }    return res;}int main(){    ll p;    ll pre,s;    while(scanf("%I64d %s",&a,str) != EOF)    {        p = strlen(str);        if(str[0] == '0' && p == 1)        {            printf("0\n");            continue;        }        sscanf(str,"%I64d",&s);        p = pow(10,p);        ll ans = -1;        for(int y = 1; y <= 10000; y*=10)        {            for(int x = (str[0] == '0'); x < 10000; ++x)            {                pre = (x*p+s)*y;                ll mod = (a-pre%a)%a;                if(mod < y)                {                    pre += mod;                    if(ans < 0 || pre < ans)                        ans = pre;                }            }        }        printf("%I64d\n",ans/a);    }    return 0;}
0 0