fork(2) download
  1. #include <iostream>
  2. #include <string>
  3. #define CZYPARZY(p) p[p.length()-1]%2==0 ? true : false
  4. using namespace std;
  5.  
  6. unsigned long long x, n, akr=0;
  7. string y, zad="";
  8.  
  9. void DzielPrzezDwa(string& my) //dzieli przez 2, ale dostaje do przerobienia tylko liczby parzyste
  10. {
  11. int a, b=0;
  12. for(int i=0; i<my.length(); i++)
  13. {
  14. a = (int)my[i] - 48 + b;
  15. b = 0;
  16. my[i] = (a/2) + 48;
  17. if(a%2==1) b = 10;
  18. }
  19. if(my[0]==48) my.erase(0, 1);
  20. }
  21.  
  22. void OdejmijJeden(string& my) //odejmuje 1, dziala na liczbach nieparzystych
  23. {
  24. my[my.length()-1] -= 1;
  25. }
  26.  
  27. void WykazZadan(string& my) //tworzy rozspiske zadan do rekonstrukcji liczby
  28. {
  29. while(my!="1")
  30. {
  31. if(CZYPARZY(my))
  32. {
  33. DzielPrzezDwa(my);
  34. zad += "2";
  35. }
  36. else
  37. {
  38. OdejmijJeden(my);
  39. zad += "1";
  40. }
  41. }
  42. zad += "0";
  43. }
  44.  
  45. void AktualnaReszta(string& ins) //odczytuje instrukcje do wykonania z zad
  46. {
  47. for(int i = (ins.length()-1); i>=0; i--)
  48. {
  49. switch(ins[i])
  50. {
  51. case 50: akr = (akr * akr) % n; break;
  52. case 49: akr = (akr * x) % n; break;
  53. case 48: akr = x % n; break;
  54. }
  55. }
  56. }
  57.  
  58.  
  59. int main()
  60. {
  61. int t;
  62. cin >> t;
  63. while(t--)
  64. {
  65. akr=0;
  66. zad="";
  67. cin >> x >> y >> n;
  68. WykazZadan(y);
  69. AktualnaReszta(zad);
  70. cout << akr << endl;
  71. }
  72. }
Success #stdin #stdout 0s 15240KB
stdin
2
54015779 489100829 472960975
827371214 966345673 443599139
stdout
350431544
391669493