Cod sursa(job #2911455)

Utilizator Gica-gicutaGeorge Gica-gicuta Data 29 iunie 2022 16:58:18
Problema Sandokan Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>

using namespace std;
ifstream cin("sandokan.in");
ofstream cout("sandokan.out");
unsigned long long cnt=0,t=0,nr=1;
unsigned long long ciur[5005];
unsigned long long prim[5005];
unsigned long long e1[5005];
unsigned long long e2[5005];
unsigned long long e3[5005];
unsigned long long v[50005];
unsigned long long f(unsigned long long a,unsigned long long b)
{
    unsigned long long sum=0,cb=b;
    for(unsigned long long j=1; j<j+1; j++)
    {
        if(b>a)
            break;
        sum+=a/b;
        b*=cb;
    }
    return sum;
}
void  E1(unsigned long long n)
{
    for(unsigned long long i=1; i<=cnt; i++)
    {
        if(prim[i]<=n)
        {
            e1[i]=f(n,prim[i]);
            e1[0]++;
        }
        else break;
    }
}
void  E2(unsigned long long m)
{
    for(unsigned long long i=1; i<=cnt; i++)
    {
        if(prim[i]<=m)
        {
            e2[i]=f(m,prim[i]);
            e2[0]++;
        }
        else break;
    }
}
void  E3(unsigned long long k)
{
    for(unsigned long long i=1; i<=cnt; i++)
    {
        if(prim[i]<=k)
        {
            e3[i]=f(k,prim[i]);
            e3[0]++;
        }
        else break;
    }
}
void prod(unsigned long long a)
{
    for(unsigned long long i=1; i<=nr; i++)
    {
        unsigned long long loc=v[i]*a+t;
        v[i]=loc%10;
        t=loc/10;
    }
    while(t>0)
    {
        nr++;
        v[nr]=t%10;
        t/=10;
    }
}
void comb(unsigned long long n,unsigned long long k)
{
    ///completare euri
    E1(n);
    E2(n-k);
    E3(k);
    for(unsigned long long i=1; i<=cnt; i++)
    {
        e1[i]=e1[i]-e2[i]-e3[i];
        //cout<<e1[i]<<'\n';
    }
    v[1]=1;
    for(unsigned long long i=1; i<=cnt; i++)
    {
        while(e1[i]>0)
        {
            prod(prim[i]);
//          cout<<prim[i]<<'\n';
            e1[i]--;
        }
    }
}
int main()
{
    for(unsigned long long i=4; i<5005; i+=2)
        ciur[i]=1;
    for(unsigned long long i=3; i*i<5005; i+=2)
    {
        if(ciur[i]==0)
        {
            for(unsigned long long j=i*i; j<5005; j+=2*i)
                ciur[j]=1;
        }
    }
    unsigned long long n,k;
    cin>>n>>k;
    k=(n-1)%(k-1);
    n--;
    for(unsigned long long i=2; i<=n; i++)
    {
        if(ciur[i]==0)
        {
            cnt++;
            prim[cnt]=i;
        }
    }
    comb(n,k);
    for(unsigned long long i=nr; i>=1; i--)
        cout<<v[i];
    return 0;
}