Advertisement
Guest User

Untitled

a guest
Nov 15th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int binpow(long long n, int m){
  6. int tmp[2][2]= {{0, 0}, {0, 0}};
  7. int result [2][2] = {{1, 0}, {0, 1}};
  8. int a [2][2] = {{0, 1}, {1, 1}};
  9.  
  10. while(n != 0){
  11. if(n % 2 == 1){
  12. //не смог вынести умножение отдельно в функцию так как забыл как передавать в нее двумерный массив
  13. //по-моему int** но точно не помню
  14. for(int i = 0; i < 2; i++){
  15. for(int j = 0; j < 2; j++){
  16. tmp[i][j] = 0;
  17. for(int k = 0; k < 2; k++){
  18. tmp[i][j] += result[i][k]*a[k][j] % m;
  19.  
  20. }
  21. }
  22. }
  23. //конец умножения
  24. //присваивание значениям матрицы result значений матрицы tmp
  25.  
  26. for(int i = 0; i < 2; i++){
  27. for(int j = 0; j < 2; j++){
  28. result[i][j] = tmp[i][j];
  29. }
  30. }
  31. //бинарное возведение в степень
  32. //n = n - 1;
  33. }
  34. //бинарное возведение в степень(условие чётности)
  35. for(int i = 0; i < 2; i++){
  36. for(int j = 0; j < 2; j++){
  37. tmp[i][j] = 0;
  38. for(int k = 0; k < 2; k++){
  39. tmp[i][j] += a[i][k]*a[k][j] % m;
  40.  
  41. }
  42. }
  43. }
  44. //
  45. for(int i = 0; i < 2; i++){
  46. for(int j = 0; j < 2; j++){
  47. a[i][j] = tmp[i][j];
  48. }
  49. }
  50.  
  51. n = n / 2;
  52. //вывод сделан чтобы посмотреть значения матрицы Result
  53. for(int i = 0; i < 2; i++){
  54. for(int j = 0; j < 2; j++){
  55. cout << result[i][j] << " ";
  56. }
  57. cout << endl;
  58. }
  59. for(int i = 0; i < 2; i++){
  60. for(int j = 0; j < 2; j++){
  61. cout << a[i][j] << " ";
  62. }
  63. cout << endl;
  64. }
  65.  
  66.  
  67. }
  68. //по результату вроде работает но выдает по номеру на 1 число дальше или я обсчитался
  69. return result[1][1];
  70.  
  71.  
  72.  
  73. }
  74.  
  75. int main()
  76. {
  77. long long n = 0;
  78. int m = 0;
  79. cin >> n >> m;
  80.  
  81. cout << binpow(n, m) << endl;
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement