Cod sursa(job #1344506)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 16 februarie 2015 19:32:00
Problema Multiplu Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <vector>
#include <bitset>
#define INF 0x3f3f3f3f
#define Nmax 2000001
using namespace std;
int N,M,D;
int cmmdc(int a,int b){
    if(b)
        return cmmdc(b, a%b);
    return a;
}
int DP[Nmax];
pair<int,int> daddy[Nmax];
queue<int> Q;

void Read()
{
    scanf("%d%d",&N,&M);
    D = N*M / cmmdc(N,M);
}


vector<int> ans;

void print(int k)
{
    int x = DP[0],r = 0;
    for(int i = 1; i < DP[0]; ++i)
    {
        ans.push_back(daddy[r].second);
        r = daddy[r].first;
    }
    ans.push_back(1);
    for(int i = (int)ans.size()-1; i >= 0; --i)
        printf("%d",ans[i]);
    exit(0);
}

void Solve(long long k)
{

    Q.push(k%D);
    memset(DP,INF,sizeof(DP));
    DP[k%D] = 1;

    int r,_r;
    while(!Q.empty())
    {
        r = Q.front();
        Q.pop();

        if(r == 0)
            print(0);

        _r = (r * 10)%D;

        if(DP[_r] > DP[r] + 1)
        {
            DP[_r] = DP[r] + 1;
            daddy[_r] = make_pair(r,0);
            Q.push(_r);
        }

        _r = (_r + 1)%D;

        if(DP[_r] > DP[r] + 1)
        {
            DP[_r] = DP[r] + 1;
            daddy[_r] = make_pair(r,1);
            Q.push(_r);
        }
    }
}

int main()
{
    freopen("multiplu.in","r",stdin);
    freopen("multiplu.out","w",stdout);

    Read();
    Solve(1);

    return 0;
}