====== AISD: pracownia B ======
*{{:aisd:10.pracownia-b.pdf|Pracownia B}}.
===== Testy =====
*{{:aisd:testy:testy-b.tar.bz2|Testy}} - testy Paczesiowej, testy jawne, pare dużych testów, generator testów
===== Generator =====
#!/usr/bin/perl -wl
$n = "01";
for $p (1..5) {
for (1..5) {
open(F, ">duze$n.in");
select(F);
print "5000 $p 999983";
for (1..$p) {
$x = sprintf("%d%d%d\n%d%d%d\n%d%d%d",
int(rand()*2), int(rand()*2), int(rand()*2),
int(rand()*2), int(rand()*2), int(rand()*2),
int(rand()*2), int(rand()*2), int(rand()*2));
$x =~ s/0/./g;
$x =~ s/1/x/g;
print $x;
}
$n++;
}
}
=====Wyniki=====
http://www.ii.uni.wroc.pl/~mbi/dyd/aisd_10s/wyniki_B.html
0 oznacza brak poprawnej odpowiedzi na jakiś test
0: Ale Gali
0: And Kaje
0: Ani Stoz
0: Are Flin
0: Bla Blab (test)
0: Dan Blas
0: Grz Kurd
0: Kam Miel
0: Kon Wypy
0: Luk Syno
0: Luk Toma
0: Mal Jurk
0: Mar Kowa
0: Mic Glen
0: Mik Ziem
0: Pat Obar
0: Paw Kali
0: Ped ober (test)
0: Pio Pole
0: Pio Posa
0: Pio Walk
0: Pio Walk (test)
0: Szy Lasz
0: Wal Augu (test)
1176: Dam Rusa
1236: Jak Tarn
1520: Paw Muri
1912: Wik Jana
2196: Krz Nowi
2496: Mar Kola
2688: Kar Kona
4484: Mac Pacu
4620: Mic Mazu
5340: EK G (test)
5424: Mat Naha (test)
5456: Mat Naha
5532: Pio Gajo
5836: Mik Kali
6036: Wal Augu (test)
6224: Krz Parj
6224: Mic Karp
6308: Mar Ryba
7148: Joa Bieg
7520: Mac Maty
8684: Paw Gawr (test)
8888: Kac Krol
9644: Mag Sara
9800: Tom Losz
9984: Raf Luka
10120: Pio Bzow
10244: Pio Ryba
10252: Mar Janc
11040: Pio Rzep
12380: Paw Kacp
12628: Bar Krok
12820: Mac Jabl (test)
12908: Mar Ocze
12912: Daw Ryzn
13456: Krz Ziel (test)
13476: Mar Wlod
13784: Mar Kacz
13972: Luk Zapa
13996: Bla Sala
14212: Nha Nguy
14436: Ale Bali
14492: Dam Stra
14516: Mic Roza
14792: Krz Ziel
15084: Mar Janu
15100: Pio Krze
15312: Dom Rogo
16516: Paw Kici
16912: Iza Bicz
18472: Dom Rusa
===== Rozwiazanie (dude) =====
Rozwiazanie nie jest optymalne.
#include
#include
#define SIZE 1024
#define NEXT(i, j) ((i << 5 | j) & 0x3FF)
unsigned int tab[SIZE];
unsigned int tab2[SIZE];
unsigned char trans[SIZE][32];
unsigned int squares[5];
unsigned int input[] = {
0x1000, 0x0080, 0x0004,
0x0800, 0x0040, 0x0002,
0x0400, 0x0020, 0x0001,
};
unsigned int mask[] = { 0x1ce7, 0x39ce, 0x739c };
int main()
{
int n, p, mod;
int i, j, k, t, modparam;
unsigned int tmp;
scanf("%d %d %d", &n, &p, &mod);
for(tmp = mod - 1, modparam = 0;
!(tmp & (unsigned int) 31 << (sizeof(unsigned int)*8 - 5));
tmp <<= 5, modparam++);
t = p;
while (t--) {
for (i = 0; i < 9; i++) {
if (!(i % 3))
getchar_unlocked();
squares[t] |= getchar_unlocked() == '.' ? 0 : input[i];
}
}
for (i = 0; i < SIZE; i++) {
tmp = i << 5;
for (j = 0; j < 32; j++, tmp++) {
for (t = 0; t < p; t++) {
for (k = 0; k < 3; k++) {
if (!((tmp & mask[k]) ^ (squares[t] << k))) {
goto OUT;
}
}
}
trans[i][j] = 1;
tab[NEXT(i,j)]++;
OUT: {}
}
}
n -= 3;
while (n--) {
memset(tab2, 0, sizeof tab);
for (i = 0; i < SIZE; i++) {
tmp = NEXT(i,0);
for (j = 0; j < 32; j++) {
tab2[tmp++] += trans[i][j] * tab[i];
}
}
memcpy(tab, tab2, sizeof tab);
if (!(n % modparam))
for (i = 0; i < SIZE; tab[i++] %= mod);
}
for (n = 0, i = 0; i < SIZE; n = (n + tab[i++]) % mod);
printf("%d\n", n);
return 0;
}