Cod sursa(job #25613)

Utilizator SebbySebastian Sebby Data 4 martie 2007 13:08:48
Problema Kperm Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
int s,n,m,st[5001],k=1,as,ev; long int nr=0;
void citire()
{FILE *f; int i;
 f=fopen("kperm.in","r");
 fscanf(f,"%d %d",&n,&m);
 fclose(f);
}
void init(int k,int *st)
{st[k]=0;}

int succesor(int k,int *st)
{if(st[k]<n){st[k]++; return 1;}
 return 0; }

int valid(int k,int *st)
{int i;
 for(i=0;i<k;i++)
   if(st[i]==st[k]) return 0;
 return 1; }

int solutie(int k)
{return(k==n);}

void tipar(int k,int *st)
{int i,j,b=1;
  for(i=1;i<=n-m+1;i++)
   {s=0;
    for(j=i;j<i+m;j++)
       s+=st[j];
    if(s%m!=0) {b=0; break;}
   }
 if(b) nr++;
}

int main()
{FILE *f; int i;
 citire();
 if(m==n)   {nr=1;
	     for(i=2;i<=n;i++)
	       nr=nr*i;
	     f=fopen("kperm.out","w");
	     fprintf(f,"%ld",nr);
	     fclose(f);}
 else
 if(m%2==0) {f=fopen("kperm.out","w");
	     fprintf(f,"%d",0);
	     fclose(f);}
   else{
 init(k,st);
 while(k>0)
   {do{as=succesor(k,st);
       if(as)
	 ev=valid(k,st);
      }while(as&&!ev);
    if(as)
      if(solutie(k)) tipar(k,st);
	else {k++; init(k,st);}
    else k--;}
 f=fopen("kperm.out","w");
 fprintf(f,"%ld",nr);
 fclose(f);
 }
return 0;
}