Cod sursa(job #1758987)

Utilizator silkMarin Dragos silk Data 18 septembrie 2016 12:31:52
Problema Pascal Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#define VMax 5000005
#define NDiv 2

int in[NDiv+1][VMax+1];
int down[NDiv+1];
int up[NDiv+1];
int f[NDiv+1];
int g[NDiv+1];
int N,D;

void Factz()
{
    int i;
    for(i = 2; i * i <= D; ++i)
    {
        if( D%i==0 ) { f[ ++f[0] ] = i; g[ ++g[0] ] = 1; D/=i; }
        while( D%i==0 ) { ++g[ g[0] ]; D/=i; }
    }
    if( D>1 ) { f[ ++f[0] ] = D; g[ ++g[0] ] = 1; }
}

void Precalc()
{
    int i,j;
    for(i = 1; i <= N; ++i)
        for(j = 1; j <= f[0]; ++j)
        {
            if( i % f[j] == 0 ) in[j][i] = 1 + in[j][i/f[j]];
            up[j] += in[j][i];
        }
    for(i = 1; i <= f[0]; ++i) down[i] = up[i];
}

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

    int i,j,ans=0,ok=0;

    scanf("%d %d",&N,&D);

    Factz();
    Precalc();

    for(i = 1; i < (N+1)/2; ++i)
    {
        for(j = 1; j <= f[0]; ++j)
        down[j] += in[j][i] - in[j][N-i+1];

        for(j = 1; j <= f[0]; ++j)
        if( up[j]-down[j]<g[j] ) break;
        if( j > f[0] ) ++ans;
    }

    if( N%2==0 )
    {
        for(j = 1; j <= f[0]; ++j)
        down[j] += in[j][i] - in[j][N-i+1];

        for(j = 1; j <= f[0]; ++j)
        if( up[j]-down[j]<g[j] ) break;
        if( j > f[0] ) ok=1;
    }


    printf("%d\n",2*ans+ok);



return 0;
}