Cod sursa(job #965146)

Utilizator proflaurianPanaete Adrian proflaurian Data 23 iunie 2013 14:56:53
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include<algorithm>
#define N 5000001
using namespace std;
int n,d,i,p,sol,e2[N],e3[N],e5[N];
void exp2(),exp3(),exp5();
int main()
{
    freopen("pascal.in","r",stdin);
    freopen("pascal.out","w",stdout);
    scanf("%d%d",&n,&d);
    if(d%2==0)exp2();if(d%3==0)exp3();if(d%5==0)exp5();
    if(d==6)
    {
        for(i=0;i<n-i;i++)if(min(e2[n]-e2[i]-e3[n-i],e3[n]-e3[i]-e3[n-i]))sol+=2;
        if(i==n-i&&min(e2[n]-e2[i]-e2[n-i],e3[n]-e3[i]-e3[n-i]))sol++;
    }
    if(d==4)
    {
        for(i=0;i<n-i;i++)if((e2[n]-e2[i]-e2[n-i])/2)sol+=2;
        if(i==n-i&&(e2[n]-e2[i]-e3[n-i])/2)sol++;
    }
    if(d==2)
    {
        for(i=0;i<n-i;i++)if(e2[n]-e2[i]-e2[n-i])sol+=2;
        if(i==n-i&&e2[n]-e2[i]-e3[n-i])sol++;
    }
    if(d==3)
    {
        for(i=0;i<n-i;i++)if(e3[n]-e3[i]-e3[n-i])sol+=2;
        if(i==n-i&&e3[n]-e3[i]-e3[n-i])sol++;
    }
    if(d==5)
    {
        for(i=0;i<n-i;i++)if(e5[n]-e5[i]-e5[n-i])sol+=2;
        if(i==n-i&&e5[n]-e5[i]-e5[n-i])sol++;
    }
    printf("%d\n",sol);
    return 0;
}
void exp2()
{
    for(p=2;p<=n;p*=2)
        for(i=p;i<=n;i+=p)e2[i]++;
    for(i=1;i<=n;i++)e2[i]+=e2[i-1];
}
void exp3()
{
    for(p=3;p<=n;p*=3)
        for(i=p;i<=n;i+=p)e3[i]++;
    for(i=1;i<=n;i++)e3[i]+=e3[i-1];
}
void exp5()
{
    for(p=5;p<=n;p*=5)
        for(i=p;i<=n;i+=p)e5[i]++;
    for(i=1;i<=n;i++)e5[i]+=e5[i-1];
}