#!/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++;
        }
}
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 nie jest optymalne.
#include <stdio.h>
#include <string.h>
 
#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;
}