fork download
  1. // A тооны B зэргийг 10^9+7 гэх анхны тоонд модулдаж гарсан хариуг ол. A, B <= 10^13
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. long long mod = 1e9+7;
  6. // 1e9 гэдэг нь 10^9 үржих нь 1 гэсэн утгатай.
  7.  
  8. long long bodolt1( long long A, long long B ) {
  9. long long ret = 1, now = A;
  10. // ret гэдэг хувьсагч нь хариу болох хувьсагч ба анхны утга нь A^0 буюу 1
  11. // now гэдэг хувьсагч нь A тооны 2^k зэргийн авах ба анхны утга нь
  12. // A^(2^0) буюу A байх юм.
  13.  
  14. while( B > 0 ) { // Хэрвээ B нь тэгээс их бол хоёртын бичиглэлд нь
  15. // хөрвүүлж дуусаагүй байна гэсэн үг.
  16.  
  17. if( B%2 == 1 ) { // Одоо байгаа B тоо нь 2-т хуваахад 1 үлддэг бол одоо
  18. // явж байгаа байрлалдах бит нь 1 байх тул үржвэрт орно.
  19. // эсрэг тохиолдолд 0 болох тул өнжиж болно.
  20. // одоо явж байгаа бит нь 1 тул A тооны одоо явж байгаа тоон зэргээр
  21. // үржигдэх ёстой гэсэн үг.
  22. ret = (ret*now)%mod;
  23. }
  24. // одоо энэ зэрэг нэгээр ахих буюу квадрат зэрэгт дэвшинэ гэсэн үг юм.
  25. now = (now*now)%mod;
  26. B /= 2; // B тоог 2т хувааж битийн байрлал ахина.
  27. }
  28. return ret; // хариуг буцааж байна.
  29. }
  30.  
  31. long long bodolt2( long long A, long long B ) {
  32. if( B == 0 ) return 1LL; // Хэрвээ B тоо нь 0 бол 1-ыг буцаана. Тооны 0 зэрэг 1
  33. if( B == 1 ) return A; // Хэрвээ B тоо нь 1 бол A^1 буюу A тоо өөрөө юм.
  34.  
  35. long long ret = bodolt2( A, B/2 );
  36. // ret хувьсагчийн одоо авж байгаа утга нь A тооны B/2 зэргийг олсон утга юм.
  37. ret = (ret*ret)%mod;
  38. // тиймээс үүнийг квадрат зэрэгт дэвшүүлнэ.
  39. if( B%2 == 1 ) {
  40. // хэрвээ сондгой бол A тоогоор үржихдэх ёстой.
  41. ret = (ret*A)%mod;
  42. }
  43. return ret; // A^B буцаах
  44. }
  45.  
  46. int main() {
  47. long long A, B;
  48. cin >> A >> B;
  49. cout << "Bodolt1-> " << bodolt1( A%mod, B ) << endl;
  50. cout << "Bodolt2-> " << bodolt2( A%mod, B ) << endl;
  51. return 0;
  52. }
Success #stdin #stdout 0s 4540KB
stdin
247 143
stdout
Bodolt1-> 87421498
Bodolt2-> 87421498