Cod sursa(job #1701091)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 12 mai 2016 09:40:57
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef long long i64;


const i64 SB = 1LL<<59;


vector<PII> facts;


void pfact(int arg) {
    i64 p = 1;

    while(p*p <= arg) {
        ++p;
        if(arg%p)
            continue;

        facts.push_back(make_pair(p, 0));
        while(arg%p==0) {
            ++facts.back().second;
            arg/=p;
        }
    }
    if(arg>1)
        facts.push_back(make_pair(arg, 1));
}

i64
 legendre(i64 num, int p) {
    i64 pt = p, ans = 0;

    while(pt<=num) {
        ans+= num / pt;
        pt *= p;
    }

    return ans;
}

bool check(i64 arg) {
    for(auto i:facts)
        if(legendre(arg, i.first)<i.second)
            return false;

    return true;
}

i64 cbin(void) {
    i64 m, ans = 0;
    for(m=SB; m; m>>=1)
        if(!check(ans|m))
            ans|=m;
    ++ans;
    return ans;
}

int main(void) {
    FILE *fi = fopen("gfact.in","r");
    FILE *fo = fopen("gfact.out","w");
    int p, q;

    fscanf(fi,"%d%d",&p,&q);
    pfact(p);

    for(auto &i:facts)

        i.second*=q;

    fprintf(fo,"%lld\n",cbin());

    fclose(fi);
    fclose(fo);
    return 0;
}