Cod sursa(job #2911446)

Utilizator Gica-gicutaGeorge Gica-gicuta Data 29 iunie 2022 16:34:57
Problema Sandokan Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>

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