fork(1) download
  1. #include <stdio.h>
  2. #include <dlfcn.h>
  3. #include <cassert>
  4. #include <gmp.h>
  5.  
  6. extern "C" {
  7. // SPOJ, codechef, ideone (64-bit)
  8. const char* gmp_path = "/usr/lib/x86_64-linux-gnu/libgmp.so.10";
  9. void* __libc_dlopen_mode(const char* x, int y);
  10. void* __libc_dlsym(void* x, const char* y);
  11. #define DLOPEN __libc_dlopen_mode
  12. #define DLSYM __libc_dlsym
  13. }
  14.  
  15. namespace gmp {
  16.  
  17. void* p = DLOPEN(gmp_path, 2);
  18. void* get(const char* name) { return DLSYM(p, name); }
  19. #define D(name) const auto my_##name = (decltype(name)*) get("__g" #name)
  20. D(mpz_init); D(mpz_init_set_ui); D(mpz_init_set); D(mpz_init_set_str);
  21. D(mpz_clear);
  22. D(mpz_set); D(mpz_set_ui);
  23. D(mpz_swap);
  24. D(mpz_set_str); D(mpz_get_str);
  25. D(mpz_inp_str); D(mpz_out_str);
  26.  
  27. D(mpz_neg);
  28. D(mpz_add); D(mpz_add_ui);
  29. D(mpz_sub); D(mpz_sub_ui);
  30. D(mpz_mul); D(mpz_mul_ui); D(mpz_mul_2exp);
  31. D(mpz_tdiv_r); D(mpz_tdiv_q); D(mpz_tdiv_qr); D(mpz_tdiv_q_2exp);
  32. D(mpz_divexact); D(mpz_divexact_ui);
  33. D(mpz_pow_ui);
  34. D(mpz_sqrt);
  35.  
  36. D(mpz_xor); D(mpz_and); D(mpz_ior);
  37. D(mpz_cmp);
  38. #undef D
  39.  
  40. struct mpz {
  41. mpz() { my_mpz_init(n); }
  42. mpz(mp_limb_t v) { my_mpz_init_set_ui(n, v); }
  43. mpz(const mpz& v) { my_mpz_init_set(n, v.n); }
  44. mpz(const char* str) { my_mpz_init_set_str(n, str, 10); }
  45. ~mpz() { my_mpz_clear(n); }
  46.  
  47. void set(const mpz& rhs) { my_mpz_set(n, rhs.n); }
  48. void set_ui(mp_limb_t i) { my_mpz_set_ui(n, i); }
  49. void inp_str(FILE* fp=stdin, int base=10) { my_mpz_inp_str(n, fp, base); }
  50. void set_str(char* str, mp_limb_t base=10) { my_mpz_set_str(n, str, base); }
  51. void get_str(char* str, mp_limb_t base=10) { my_mpz_get_str(str, base, n); }
  52.  
  53. void print(FILE* fp=stdout) { my_mpz_out_str(fp, 10, n); }
  54. void println(FILE* fp=stdout) { print(fp); fprintf(fp, "\n"); }
  55.  
  56. static void add(mpz& c, mpz& a, mpz& b) { my_mpz_add(c.n, a.n, b.n); }
  57. static void mul(mpz& c, mpz& a, mpz& b) { my_mpz_mul(c.n, a.n, b.n); }
  58. static void mul_ui(mpz& c, mpz& a, mp_limb_t b) { my_mpz_mul_ui(c.n, a.n, b); }
  59. static void sqrt(mpz& dest, mpz& src) { my_mpz_sqrt(dest.n, src.n); }
  60. static void divmod(mpz& q, mpz& r, mpz& n, mpz& d) { my_mpz_tdiv_qr(q.n, r.n, n.n, d.n); }
  61. static void div(mpz& q, mpz& n, mpz& d) { my_mpz_tdiv_q(q.n, n.n, d.n); }
  62. static void divexact(mpz &q, mpz& n, mpz& d) { my_mpz_divexact(q.n, n.n, d.n); }
  63. static void mod(mpz& r, mpz& n, mpz& d) { my_mpz_tdiv_r(r.n, n.n, d.n); }
  64. static void swap(mpz& a, mpz& b) { my_mpz_swap(a.n, b.n); }
  65.  
  66. void negate() { my_mpz_neg(n, n); }
  67. void pow_ui(mp_limb_t e) { my_mpz_pow_ui(n, n, e); }
  68. void divexact_ui(mp_limb_t c) { my_mpz_divexact_ui(n, n, c); }
  69. void divexact(mpz& rhs) { my_mpz_divexact(n, n, rhs.n); }
  70. bool operator == (mpz& rhs) { return my_mpz_cmp(n, rhs.n) == 0; }
  71. bool operator <= (mpz& rhs) { return my_mpz_cmp(n, rhs.n) <= 0; }
  72. bool operator < (mpz& rhs) { return my_mpz_cmp(n, rhs.n) < 0; }
  73. mpz& operator *= (mpz& rhs) { my_mpz_mul(n, n, rhs.n); return *this; }
  74. mpz& operator *= (mp_limb_t rhs) { my_mpz_mul_ui(n, n, rhs); return *this; }
  75. mpz& operator <<= (int s) { my_mpz_mul_2exp(n, n, s); return *this; }
  76. mpz& operator >>= (int s) { my_mpz_tdiv_q_2exp(n, n, s); return *this; }
  77.  
  78. mpz_t n;
  79. };
  80.  
  81. } // namespace gmp
  82.  
  83. int main() {
  84.  
  85. using namespace gmp;
  86. mpz n;
  87. n.set_ui(5);
  88. n.pow_ui(100);
  89. n.println();
  90. return 0;
  91. }
  92.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
7888609052210118054117285652827862296732064351090230047702789306640625