Cod sursa(job #2924847)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 11 octombrie 2022 23:09:30
Problema GFact Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("gfact.in");
ofstream fout("gfact.out");

int prime[3000], primeFact[20], primeCnt[20], nrprime=1;
bool isprime;

void primegen(){
    for(int i=3;nrprime<3000;i+=2){
        isprime=true;
        for(int j=1;j<nrprime&&prime[j]*prime[j] <= i;j++){
            if(i%prime[j]==0){
                isprime=false;
                break;
            }
        }
        if(isprime){
            prime[nrprime]=i;
            nrprime++;
        }
    }
}

int main()
{
    int p, q, a=1, nrfact=0, factorial=1, termen=2, i, termenc;

    fin>>p>>q;
    prime[0]=2;
    primegen();

    for(i=1;i<=q;i++){
        a*=p;
    }

    while(a!=1){
        for(i=0;i<2999;i++){
            if(a==1){
                break;
            }
            if(a%prime[i]==0){
                nrfact++;
                primeFact[nrfact]=prime[i];
                while(a%prime[i]==0){
                    a/=prime[i];
                    primeCnt[nrfact]++;
                }
            }
        }
    }

    while(true){
        factorial*=termen;
        for(int i=1;i<=nrfact;i++){
            if(termen%primeFact[i]==0){
                termenc=termen;
                while(termenc%primeFact[i]==0){
                    primeCnt[i]--;
                    termenc/=primeFact[i];
                }
                break;
            }
        }
        for(i=1;i<=nrfact;i++){
            isprime=true;
            if(primeCnt[i]!=0){
                isprime=false;
                break;
            }
        }
        if(isprime){
            fout<<termen;
            break;
        }
        termen++;
    }

    return 0;
}