fork(1) download
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5. unsigned short int ldt; //liczba dni dla tygodnia <1;100>
  6. unsigned short int lm; //liczba miesiecy <1;1000>
  7. unsigned long long int a, b, m; //parametry funkcji <1;100 000>
  8. unsigned long long int p; //prog
  9. unsigned short int mprz; //w ktorym miesiacu doliczamy dodatkowy dzien
  10. unsigned long long int n; //liczba dat do sprawdzenia; w indeksie - dla danej daty
  11.  
  12. //------------------wejscie i implementacje tablic
  13. cin>>lm>>ldt>>a>>b>>m>>p>>mprz; //wczytanie danych
  14. unsigned short int dm[lm]; //dni w kolejnych m-cach roku
  15. unsigned long int dr=0; //dni w roku standardowym
  16. for(unsigned short int i=0;i<lm;++i){
  17. cin>> dm[i]; //liczba dni w kolejnych m-cach <1;100>
  18. dr+=dm[i];
  19. }
  20. cin>>n; //ilosc dat do sprawdzenia <1;100 000>
  21. unsigned long int dzien[n], miesiac[n], r[n]; //daty
  22. unsigned long int sumbmcy=0; //suma dni miesiecy bierzacego roku
  23. unsigned long long int roks=0; //zmienne pomocnicze dla funkcji na rok przestepny
  24. unsigned long int max=0; //dla rozmiaru tablicy przestepnych
  25. for(unsigned int i=0;i<n;++i){
  26. cin>>dzien[i]>>miesiac[i]>>r[i]; //r <1;100 000>
  27. if (r[i]>max) max=r[i]; //sprawdza najwiekszy rok do wielkosci tablic
  28. }
  29. unsigned long int sumaprzestepnych[max+1];
  30. sumaprzestepnych[0]=0;
  31. unsigned long long int wynik;
  32.  
  33. //------------------liczenie sumy lat przystepnych dla n-tej daty
  34. for(unsigned long int j=0;j<n;++j){ //kreci po n-tej dacie
  35. if(r[j]>1){ //wchodzi tylko gdy jest co liczyc, inaczej korzysta z danych z implementacji
  36. for (unsigned long int i=2;--i<=r[j];++i){
  37. roks=(a*(roks)+b+i)%m; //funkcja
  38. sumaprzestepnych[i]=sumaprzestepnych[i-1];//przepisz liczbe lat przestepnych do n-tej daty
  39. if(roks>p) ++sumaprzestepnych[i]; //zwieksz liczbe lat przestepnych do n-tej daty jesli funkcja spelnia warunek progu;
  40. }
  41. }
  42.  
  43. //------------------liczenie sumy dni od poczatku swiata do daty
  44. sumbmcy=0;
  45. for(unsigned short int l=0; l<miesiac[j]-1;++l)
  46. sumbmcy+=dm[l]; //suma dni z miesiecy do obecnego
  47. wynik=(dr*((r[j])-1)+sumaprzestepnych[r[j]-1]+sumbmcy+dzien[j]);
  48. if(sumaprzestepnych[r[j]-1]-sumaprzestepnych[r[j]-2]==1 && miesiac[j]<=mprz) --wynik;//jezeli rok bierzacy jest przestepny i przestepny miesiac nie minal, to nie doliczaj dnia przestepnego
  49. wynik=wynik%ldt; //modul liczacy dzien tygodnia z sumy
  50. if (wynik==0) wynik=ldt;
  51. //------------------wyjscie
  52. cout<<wynik<<endl;
  53. }
  54. return 0;
  55. }
  56.  
  57. /*
  58. Nasza niezrozumiała jeszcze do końca ludzka natura sprawia, że uwielbiamy żyć cudzym życiem. Dzięki temu ogromną popularnością cieszą się wszelkiego rodzaju seriale, poprzez które identyfikując się z postaciami mamy okazję na jedną godzinę stać się światowej sławy chirurgiem, paranormalną istotą czy średniowiecznym rycerzem. W tytułach seriali możemy przebierać i każdy znajdzie coś dla siebie. Jednak w tym sezonie bezsprzecznie bitwę o uwagę widza wygrywa wytwórnia OBH i jej wielki kasowy hit Gra o Fotel. Fabuła serialu bazuje na książkowym bestselerze E.E.G. Marvina o tym samym tytule i jest osadzona w fikcyjnej krainie Ośmiu Królestw. Zachwyca nas w niej mnogość wątków, zwroty akcji i nietuzinkowość bohaterów, którzy walczą pomiędzy sobą o prawo do zasiadania na Tytanowym Fotelu na kontynencie Easteros.
  59.  
  60. Twórcy Gry o Fotel zmagają się codziennie z licznymi problemami. Na przykład wciąż nie uporządkowali kwestii kalendarza w Ośmiu Królestwach. Wiadomo, że tu pory roku rządzą się trochę innymi prawami, a pojęcia dzień i noc są raczej wskazówką niż wiarygodną formą odmierzania czasu.
  61.  
  62. Scenarzyści jednogłośnie uznali (w porozumieniu z autorem książki), że warto byłoby stworzyć osobliwy kalendarz dla fikcyjnych bohaterów z innymi miesiącami, dniami tygodnia, długością roku, oszacowanych na podstawie opisów minionej historii. Opracowali także metodę, która określa, czy dany rok jest przestępny. Twórcy nie wiedzą jeszcze, czy takie rozwiązanie zda egzamin. Nie wiedzą także jaka konfiguracja miesięcy będzie najlepiej oddawała rok w krainie. Chcą mieć jednak możliwość przeprowadzenia testów, a jednym z nich jest łatwość, z jaką dla danej konfiguracji oblicza się dzień tygodnia dla podanej daty. Napisanie tego testu pozostawili programistom zatrudnionym w wytwórni OBH. Nie będzie żadną niespodzianką fakt, że programiści ci z kolei zlecili to grupie studentów z UMCS (zawsze tak robią)...
  63.  
  64. Metoda sprawdzenia, czy rok jest przestępny wygląda następująco:
  65. F(1) = 0
  66. F(rok) = (a*F(rok-1)+b+rok) mod m, gdzie a, b i m to wybrane przez scenarzystów parametry.
  67.  
  68. Jeśli wartość powyższej funkcji dla wybranego roku przekroczy próg (również wymyślony przez scenarzystów), to rok jest przestępny.
  69.  
  70. Zakładamy, że pierwszego dnia pierwszego miesiąca pierwszego roku mamy pierwszy dzień tygodnia. Dodatkowo obliczenia rozpoczynamy od roku 1.
  71.  
  72.  
  73. Wejście:
  74. Na standardowym wejściu w pierwszym wierszu podanych jest 7 liczb dodatnich lm, ldt, a, b, m, p, mprz oznaczające kolejno dla rozważanej konfiguracji liczbę miesięcy, ile dni ma tydzień, parametry dla funkcji, próg oraz w którym miesiącu doliczany jest dodatkowy dzień, gdzie lm należy do <1;1000>, ldt <1;100>, a,b,p,m do <1;100000>. W kolejnym wierszu znajduje się ciąg lm liczb dodatnich z przedziału <1;100>, z których każda oznacza liczbę dni w kolejnych miesiącach.
  75. Następny wiersz to liczba naturalna n, a w kolejnych n wierszach znajdują się 3 liczby dodatnie d, m, r, oznaczające datę w postaci „dzień miesiąc rok”, gdzie n należy do <1;10000>, r należy do <1;10000>.
  76.  
  77. Wyjście:
  78. Na standardowym wyjściu należy podać n liczb naturalnych, oznaczających numer dnia tygodnia, jaki przypada dla każdej z wybranych dat.
  79.  
  80. Przykład:
  81.  
  82. Wejście:
  83. 3 5 4 2 20 15 2
  84. 10 12 7
  85. 2
  86. 9 2 1
  87. 7 3 100
  88. Wyjście:
  89. 4
  90. 5
  91. */
Time limit exceeded #stdin #stdout 5s 3300KB
stdin
3 5 4 2 20 15 2 
10 12 7 
5 
9 2 1 
7 3 100
12 2 100
13 2 100
1 3 100
stdout
4