Cod sursa(job #10237)

Utilizator crawlerPuni Andrei Paul crawler Data 27 ianuarie 2007 23:56:28
Problema Pascal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>

long x[5000001],x2[5000001],x3[5000001],m;

void trans1(long m1)
 {
  long i,m12=m1;
  
  for(i=2;i<=m12;++i)
   {
    x[i]=0;
    if(m12%i==0)
     {
      while(m12%i==0)
       {
        ++x[i];
        m12/=i;
       }
     }

    }
   if(m12!=1)
     ++x[m12];
 }

void trans2(long m1)
 {


  long i,m12=m1;
  
  for(i=2;i<=m12;++i)
   {
      x2[i]=0;
    if(m12%i==0)
     {
      while(m12%i==0)
       {
        ++x2[i];
        m12/=i;
       }
     }       }
   if(m12!=1)
     ++x2[m12];
 }
void trans3(long m1)
 {


  long i,m12=m1;
  
  for(i=2;i<=m12;++i)
   {
      x3[i]=0;
      if(m12%i==0)
     {
      while(m12%i==0)
       {
        ++x3[i];
        m12/=i;
       }
     }  }
   if(m12!=1)
     ++x3[m12];
 }

int ver()
 {
  for(int i=1;i<=m;++i)
   if(x[i])
    if(!(x[i]+x2[i]>=x3[i]))
     return 0;

  return 2;
 }

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

   register long i,j,n,X=0,n1,m1;

   scanf("%ld%ld",&n,&m);


   trans3(m);
    
   m1=n+1;
   n1=n>>1;
   
   for(i=1;i<=n1;++i)
    {
     --m1;
     trans1(m1);
     trans2(i);
     X+=ver();
    }

   if(n&1)
    {
     --m1;
     trans1(m1);
     trans2(i);
     if(ver())
      ++X;
    }
    
   printf("%ld\n",X);

   return 0;
 }