Cod sursa(job #466202)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 26 iunie 2010 12:11:18
Problema Permutari2 Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 0.93 kb
#include <stdio.h>

#define DIM 305
#define MOD 10007

int X[DIM], viz[DIM], SN[DIM];
int N, K, NRP;

void sum_1toN (int n){
	for (int i = 1; i <= n; ++i)
		SN[i] = SN[i-1] + i;
}

void perm (int k, int sX, int c) {
	int i;
	if (k == N){
/*		int sX = 0, c = 0;
		for (i = 1; i <= N; ++i){
			printf ("%d", X[i]);
			sX += X[i];
			if (sX == SN[i])
				++c;
		}
		printf (" %d\n", c);*/
		if (c+1 == K) NRP = (NRP + 1) % MOD;
		return;
	}
	int add;
	for (i = 1; i <= N; ++i)
		if (!viz[i]){
			X[k] = i;
			add = 0;
			if (sX + X[k] == SN[k])
				++add;
			if (c+add == K) continue;
			if (c+add + N-k < K) continue;
			
			viz[i] = 1;
			perm (k + 1, sX + X[k], c+add);
			viz[i] = 0;			
		}
	
	
}

int main () {
	
	freopen ("permutari2.in", "r", stdin);
	freopen ("permutari2.out", "w", stdout);
	
	scanf ("%d%d", &N, &K);
	
	sum_1toN (N);
	perm (1, 0, 0);
	
	printf ("%d", NRP);
	
	return 0;
}