Cod sursa(job #660643)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 13 ianuarie 2012 11:58:01
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb

#include<iostream>
#include<fstream>
using namespace std;
int ok( int d, long long  w[])
{
	if (d==4) return w[2]>1;
	if (d==6) return w[2]>0 && w[3]>0;
	return w[d]>0;
}
	
void desc(int n, long long a[],int d)
{
	if (d==2 || d==4 ||d==6)
	{
		long long  y=2;
			while (n/y>0)
			{
				a[2]=a[2]+int (n/y);
				y=y*2;
			}
	}
	if (d==3|| d==6)
	{
		long long  y=3;
			while (n/y>0)
			{
				a[3]=a[3]+int (n/y);
				y=y*3;
			}
	}
	if (d==5)
	{
		long long  y=5;
			while (n/y>0)
			{
				a[5]=a[5]+int (n/y);
				y=y*5;
			}
	}
}
void adunare_v ( long long b[], long long  c[], long long a[])
{
	int i;
	for (i=2;i<=5;i++)
		if (i!=4)
			b[i]=a[i]-b[i]-c[i];
}
int main(void)
{
	long long  n,d,nr=0,i;
	fstream f,g;
	f.open("pascal.in",ios::in);
	g.open("pascal.out",ios::out);
	f>>n>>d;
	long long  a[7]={0};
	desc (n,a,d);
	
	if (n==0 || n==1)
		{
			g<<0;
			return 0;
		}
	
	for (i=1;i<=n/2;i++)// !! par sau impar
	{
		long long w[7]={0},y[7]={0};
		
		desc(n-i,w,d);
		desc(i,y,d);
		adunare_v(w,y,a);
		if (ok(d,w))
			nr+=2;
	}
	if (n%2==0)
		nr--;
	g<<nr;
}

/*
#include<stdio.h>
#include<math.h>
long r,d,nr,i,a[6],n1,n2,n;
void asd()
{
    while(n1%2==0) {a[2]++;n1=n1/2;}
    while(n1%3==0) {a[3]++;n1=n1/3;}
    while(n1%5==0) {a[5]++;n1=n1/5;}
    while(n2%2==0) {a[2]--;n2=n2/2;}
    while(n2%3==0) {a[3]--;n2=n2/3;}
    while(n2%5==0) {a[5]--;n2=n2/5;}
}


int div()
{
    if(d==6) return a[2]>0&&a[3]>0;
    if(d==4) return a[2]>1;
    return a[d]>0;
    }


int main()
{
    FILE *f=fopen("pascal.in","rt");
    FILE *g=fopen("pascal.out","wt");
 fscanf(f,"%ld %ld",&n,&d);
 r=n;
 for(i=1;i<=r/2;i++,n--)
 {
	n1=n;
	n2=i;
	asd();
	if(div())
		nr=nr+2;
 }
  if(div()&& r%2==0)
	nr--;
 fprintf(g,"%ld",nr);
 return 0;
}
*/