Cod sursa(job #1758453)

Utilizator silkMarin Dragos silk Data 17 septembrie 2016 12:06:27
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#define NDiv 14

int down[NDiv+1];
int up[NDiv+1];
int f[NDiv+1];
int g[NDiv+1];

int get_exp(int T, int x)
{
    int r=x,ans=0;
    while( r<=T ) { ans += T/r; r *= x; }
    return ans;
}

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

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

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

    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; }

    for(i = 1; i <= f[0]; ++i) up[i] = get_exp(N, f[i]);

    for(i = 1; i < (N+1)/2; ++i)
    {
        for(j = 1; j <= f[0]; ++j) down[j] = get_exp(i, f[j]) + get_exp(N-i, f[j]);
        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] = get_exp(N/2, f[j]) + get_exp(N-N/2, f[j]);
        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;
}