Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
//#include <conio.h>

long n,m,klawisze[400001][3],liczba;
char stan[200001],stop;
char bylo[1050001]; // Maksymalnie dla n==20
long teraz[200001],pozniej[200001], SUM;


long liczba_ze_stanu()
{
long LL=stan[1];
for (int qwe=2; qwe<=n; qwe++)   LL=LL*2+stan[qwe];
return LL;
}


int stan_z_liczby(long liczba)
{
for (int qwe=n; qwe>=1; qwe--)
	{
	 stan[qwe] = liczba % 2;
	 liczba = liczba/2;
	}
return 0;
}


int main()
{
scanf("%ld",&n);
scanf("%ld",&m);
for (int ii=1; ii<=n; ii++)   scanf("%d",&stan[ii]);
for (int ii=1; ii<=m; ii++)   scanf("%ld %ld",&klawisze[ii][1], &klawisze[ii][2]);

if (m==0) {printf("1"); return 0;}

for (int ii=0; ii<=1050000; ii++) bylo[ii]=0;
// Zamieniam stan na liczb�:
pozniej[0]=1;   pozniej[pozniej[0]]=liczba_ze_stanu();
bylo[ pozniej[pozniej[0]] ] = 1;

stop=0;
while (!stop)
	{
	 for (int ii=0; ii<=pozniej[0]; ii++)   teraz[ii] = pozniej[ii];
	 pozniej[0]=0;
	 
	 if (teraz[0]==0)   stop=1;
	 // Po kolei sprawdzam zapisane stany:
	 for (int ter=1; ter<=teraz[0]; ter++)
	 	{
	 	 // Na podstawie liczby tworz� dany stan:
	 	 stan_z_liczby(teraz[ter]);
	 	 
//	 	 printf("Biezaca liczba: %ld\n",teraz[ter]);
//	 	 printf("Stan: ");    for (int ii=1; ii<=n; ii++)   printf("%d ",stan[ii]);
//	 	 printf("\n\n");
	 	 
	 	 // Teraz po kolei pr�buj� ka�dego z przycisk�w i sprawdzam, czy kt�ry� mo�e zadzia�a�.
	 	 for (int klaw=1; klaw<=m; klaw++)
	 	 	{
	 	 	 if ( stan[ klawisze[klaw][1] ] == stan [ klawisze[klaw][2] ] )
	 	 	 	{
//	 	 	 	 printf("Zadzialal klawisz (%ld,%ld)\n",klawisze[klaw][1],klawisze[klaw][2]);
//	 	 	 	 getch();
	 	 	 	 
	 	 	 	 // Ten zadzia�a, wi�c chwilowo w��czam ten klawisz
	 	 	 	 stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2;
	 	 	 	 stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ];
	 	 	 	 
	 	 	 	 // Sprawdzam, czy ten stan ju� wcze�niej by� rozpatrywany:
	 	 	 	 liczba = liczba_ze_stanu();
	 	 	 	 if (bylo[liczba]==0)
	 	 	 	 	{ // Tego stanu jeszcze nie by�o - zapisuj� do zrobienia p�niej
	 	 	 	 	 pozniej[0]++;
	 	 	 	 	 pozniej[pozniej[0]] = liczba;
	 	 	 	 	 bylo[liczba]=1;
//	 	 	 	 	 if (pozniej[0] >=200000) printf("PRZEKROCZYLEM LIMIT!!!!\n");
	 	 	 	 	}
	 	 	 	 
	 	 	 	 // Ju� sprawdzi�em, wi�c wracam z tym klawiszem
	 	 	 	 stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2;
	 	 	 	 stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ];
	 	 	 	}
	 	 	}
	 	 
	 	}
	}
// Zapisalem wszystkie stany, teraz trzeba to podliczyc:
SUM=0;
for (int ii=0; ii<=1050000; ii++)    if (bylo[ii]==1) SUM++;

/*
printf("Wypis:\n");
for (int ii=0; ii<=1050000; ii++)    if (bylo[ii]==1) 
	{
	 stan_z_liczby(ii);
	 for (int jj=1; jj<=n; jj++)   printf("%d ",stan[jj]);
	 printf("\n");
	}
*/




//printf("W sumie mozliwe stany to: %ld\n",SUM);
printf("%ld",SUM);

return 0;
}