Cod sursa(job #25888)

Utilizator AdixSuciu Adrian Adix Data 4 martie 2007 15:54:21
Problema Kperm Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
int n,p;
long numar,contor;
//int perm[5000];

long factorial(long nr){
     long i,prod=1;
     for(i=1;i<=nr;i++) prod=prod*i;
     return prod;

     }
void scriere(){
     FILE *out;
     out=fopen("kperm.out","w");
		 fprintf(out,"%ld",2*factorial(contor));
     fclose(out);
     
     }

void citire(){
     FILE *in;
     in=fopen("kperm.in","r");
     fscanf(in,"%d %d",&n,&p);
     if(p==0||p==1||p==2||p%2==0) scriere();
     fclose(in);     
     }
     

// generez aranjamente
// daca verifica adun la numar;
// inmultzesc numaru cu 


void init(int k,int *st)
{st[k]=st[k-1];}

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

int valid(int k,int *st)
{ return 1; }

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

long suma(int *st){
int i,sum=0;
     for(i=1;i<=p;i++)sum=sum+st[i];        
		 return sum;
          }

void tipar(int k, int *st){
     long sum,i;
     sum=suma(st);
		 if(sum%p==0){//for(i=1;i<=k;i++)
               //a[contor][i]=st[i]; 
               contor++;}
     }

void rutina(){
int  k,st[5000],as,ev;
st[0]=0;
k=1;

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--;  }

     
     }

void procesare(){
     rutina();
//     verificare();
     }
int main(){
 citire();
 procesare();
 scriere();
 return 0;
 }