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.
#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; }
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; } |