fork download
  1. #include <stdio.h>
  2. #include "gmp.h"
  3.  
  4. /// dlfcn.h ///
  5. #if defined(WIN32) || (!defined(__GNUC__) && !defined(__clang__))
  6. void* LoadLibraryA(const char *x);
  7. void* GetProcAddress(void *x,const char *y);
  8. int FreeLibrary(void *x);
  9. #elif defined(__APPLE__)
  10. void* dlopen(const char *x,int y);
  11. void* dlsym(void *x,const char *y);
  12. int dlclose(void *x);
  13. #define LoadLibraryA(s) dlopen(s,2)
  14. #define GetProcAddress dlsym
  15. #define FreeLibrary dlclose
  16. #else
  17. void* __libc_dlopen_mode(const char *x,int y);
  18. void* __libc_dlsym(void *x,const char *y);
  19. int __libc_dlclose(void *x);
  20. #define LoadLibraryA(s) __libc_dlopen_mode(s,2)
  21. #define GetProcAddress __libc_dlsym
  22. #define FreeLibrary __libc_dlclose
  23. #endif
  24.  
  25. typedef void (*type_mpz_init)(mpz_t);
  26. typedef void (*type_mpz_clear)(mpz_t);
  27. typedef void (*type_mpz_out_str)(FILE*,int,mpz_t);
  28. typedef void (*type_mpz_set)(mpz_t,mpz_t);
  29. typedef void (*type_mpz_set_ui)(mpz_t,unsigned long);
  30. typedef void (*type_mpz_cmp_ui)(mpz_t,unsigned long);
  31.  
  32. typedef void (*type_mpz_add)(mpz_t,mpz_t,mpz_t);
  33. typedef void (*type_mpz_sub)(mpz_t,mpz_t,mpz_t);
  34. typedef void (*type_mpz_mul)(mpz_t,mpz_t,mpz_t);
  35. typedef void (*type_mpz_tdiv_q)(mpz_t,mpz_t,mpz_t);
  36. typedef void (*type_mpz_tdiv_r)(mpz_t,mpz_t,mpz_t);
  37.  
  38. type_mpz_init mympz_init;
  39. type_mpz_clear mympz_clear;
  40. type_mpz_out_str mympz_out_str;
  41. type_mpz_set mympz_set;
  42. type_mpz_set_ui mympz_set_ui;
  43. type_mpz_cmp_ui mympz_cmp_ui;
  44.  
  45. type_mpz_add mympz_add;
  46. type_mpz_sub mympz_sub;
  47. type_mpz_mul mympz_mul;
  48. type_mpz_tdiv_q mympz_tdiv_q;
  49. type_mpz_tdiv_r mympz_tdiv_r;
  50.  
  51. void mul(mpz_t a1,mpz_t b1,mpz_t c1,mpz_t d1,mpz_t a2,mpz_t b2,mpz_t c2,mpz_t d2){
  52. mpz_t a0,b0,c0,d0,t,u;
  53. mympz_init(a0);
  54. mympz_init(b0);
  55. mympz_init(c0);
  56. mympz_init(d0);
  57. mympz_init(t);
  58. mympz_init(u);
  59.  
  60. mympz_mul(t,a1,a2);
  61. mympz_mul(u,b1,c2);
  62. mympz_add(a0,t,u);
  63. mympz_mul(t,a1,b2);
  64. mympz_mul(u,b1,d2);
  65. mympz_add(b0,t,u);
  66. mympz_mul(t,c1,a2);
  67. mympz_mul(u,d1,c2);
  68. mympz_add(c0,t,u);
  69. mympz_mul(t,c1,b2);
  70. mympz_mul(u,d1,d2);
  71. mympz_add(d0,t,u);
  72.  
  73. mympz_set(a1,a0);
  74. mympz_set(b1,b0);
  75. mympz_set(c1,c0);
  76. mympz_set(d1,d0);
  77.  
  78. mympz_clear(a0);
  79. mympz_clear(b0);
  80. mympz_clear(c0);
  81. mympz_clear(d0);
  82. mympz_clear(t);
  83. mympz_clear(u);
  84. }
  85.  
  86. int main(){
  87. //void *h=LoadLibraryA("/opt/local/lib/libgmp.dylib"); //MacPorts
  88. //void *h=LoadLibraryA("/usr/lib/i386-linux-gnu/libgmp.so.10.0.5"); //ideone-codeiq
  89. void *h=LoadLibraryA("/usr/lib/i386-linux-gnu/libgmp.so.10"); //ideone
  90. //void *h=LoadLibraryA("/usr/lib64/libgmp.so.10.0.2"); //wandbox
  91. //void *h=LoadLibraryA("/usr/lib64/libgmp.so.10"); //yukicoder
  92.  
  93. mympz_init=(type_mpz_init)GetProcAddress(h,"__gmpz_init");
  94. mympz_clear=(type_mpz_clear)GetProcAddress(h,"__gmpz_clear");
  95. mympz_out_str=(type_mpz_out_str)GetProcAddress(h,"__gmpz_out_str");
  96. mympz_set=(type_mpz_set)GetProcAddress(h,"__gmpz_set");
  97. mympz_set_ui=(type_mpz_set_ui)GetProcAddress(h,"__gmpz_set_ui");
  98. mympz_cmp_ui=(type_mpz_cmp_ui)GetProcAddress(h,"__gmpz_cmp_ui");
  99.  
  100. mympz_add=(type_mpz_add)GetProcAddress(h,"__gmpz_add");
  101. mympz_sub=(type_mpz_sub)GetProcAddress(h,"__gmpz_sub");
  102. mympz_mul=(type_mpz_mul)GetProcAddress(h,"__gmpz_mul");
  103. mympz_tdiv_q=(type_mpz_tdiv_q)GetProcAddress(h,"__gmpz_tdiv_q");
  104. mympz_tdiv_r=(type_mpz_tdiv_r)GetProcAddress(h,"__gmpz_tdiv_r");
  105.  
  106. mpz_t a1,b1,c1,d1,a2,b2,c2,d2;
  107. mympz_init(a1);
  108. mympz_init(b1);
  109. mympz_init(c1);
  110. mympz_init(d1);
  111. mympz_init(a2);
  112. mympz_init(b2);
  113. mympz_init(c2);
  114. mympz_init(d2);
  115.  
  116. mympz_set_ui(a1,1);
  117. mympz_set_ui(b1,0);
  118. mympz_set_ui(c1,0);
  119. mympz_set_ui(d1,1);
  120. mympz_set_ui(a2,1);
  121. mympz_set_ui(b2,1);
  122. mympz_set_ui(c2,1);
  123. mympz_set_ui(d2,0);
  124.  
  125. int N;
  126. scanf("%d",&N);
  127. N=(N+3)/2*2;
  128. for(;N;N>>=1){
  129. if(N&1)mul(a1,b1,c1,d1,a2,b2,c2,d2);
  130. mul(a2,b2,c2,d2,a2,b2,c2,d2);
  131. }
  132. mympz_set_ui(a2,1);
  133. mympz_sub(c1,c1,a2);
  134. mympz_out_str(stdout,10,c1);
  135. puts("");
  136.  
  137. mympz_clear(a1);
  138. mympz_clear(b1);
  139. mympz_clear(c1);
  140. mympz_clear(d1);
  141. mympz_clear(a2);
  142. mympz_clear(b2);
  143. mympz_clear(c2);
  144. mympz_clear(d2);
  145.  
  146. FreeLibrary(h);
  147. }
Success #stdin #stdout 0s 2292KB
stdin
2015
stdout
24410294683171395267259945469996127000411199333760853190535535281681195871429510314079442068798555059453792431772087225245168879580469159794544170936403149540819320510882801573596907938222922817134288725100817648047405608500267748766714030468003650259685406411646787207097050545802045736020993909154298598218721111963426993884619351338577630868510716463423585020972878819198991971234596733617320373133963970742975210614208