Pagini recente » Cod sursa (job #2784487) | Cod sursa (job #3037554) | Cod sursa (job #1416375) | Cod sursa (job #1169752) | Cod sursa (job #25888)
Cod sursa(job #25888)
#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;
}