Cod sursa(job #796254)

Utilizator assa98Andrei Stanciu assa98 Data 10 octombrie 2012 21:30:00
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#define min(a,b) a<b?a:b

int c[5000100];
int D,n;

int legendre(int n,int k)
{
    int s=0;
    int p=k;
    while(p<=n)
    {
        s+=(n/p);
        p=p*k;
    }
    return s;
}

int a;
int sol;
int d[10];
int main()
{
    freopen("pascal.in","r",stdin);
    freopen("pascal.out","w",stdout);
    scanf("%d%d",&n,&D);
    /*if(d==6)
        a=legendre(n,2)+legendre(n,3);
    else if(d==4)
        a=legendre(n,2)/2;
    else
        a=legendre(n,d);
    c[0]=0;
    for(int i=1;i<=n;i++)
    {
        if(i%d==0)
        {
            c[i]=c[i/d]+1;
        }
        else
            c[i]=0;
    }
    int x=a,y=0;
    for(int i=0;i<=n;i++)
    {
        if((a-x-y)>0)
            sol++;
        x-=c[n-i];
        y+=c[i+1];
    }*/
    for(int i=1; i<=n; i++)
    {
        int N=n-i+1;
		while (N % 2 == 0) {N /= 2;d[2]++;}
		while (N % 3 == 0) {N /= 3;d[3]++;}
		while (N % 5 == 0) {N /= 5;d[5]++;}
		int K=i;
		while (K % 2 == 0)  {K /= 2;d[2]--;}
		while (K % 3 == 0)  {K /= 3;d[3]--;}
		while (K % 5 == 0)  {K /= 5;d[5]--;}

        if (D == 4)
        {
            if (d[2] >= 2)
                sol++;
        }
        else if (D == 6)
        {
            if (min(d[2],d[3]) > 0)
                sol++;
        }
        else if (d[D])
            sol++;
    }
    printf("%d",sol);
    return 0;
}