fork(6) download
  1. open System
  2. open System.Runtime.InteropServices
  3.  
  4. let bufsiz=32
  5.  
  6. [<Literal>]
  7. //MacPorts
  8. //let libgmp="/opt/local/lib/libgmp.dylib"
  9. //ideone
  10. let libgmp="/usr/lib/i386-linux-gnu/libgmp.so.10"
  11. //let libgmp="/usr/lib/libgmp.so.3"
  12. //paiza.io/atcoder
  13. //let libgmp="/usr/lib/x86_64-linux-gnu/libgmp.so.10"
  14. //wandbox/yukicoder
  15. //let libgmp="/usr/lib64/libgmp.so.10"
  16. //AOJ
  17. //let libgmp="/usr/lib64/libgmp.so.3"
  18.  
  19. module libc=
  20. [<DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)>]extern int write(int x,int y,int z)
  21. [<DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)>]extern IntPtr fopen(string x,string y)
  22. [<DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)>]extern int fflush(IntPtr x)
  23. [<DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)>]extern int puts(string x)
  24. [<DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl)>]extern int system(string x)
  25.  
  26. module gmp=
  27. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_init(IntPtr a)
  28. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_clear(IntPtr a)
  29. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_out_str(IntPtr a,int b,IntPtr c)
  30. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_set(IntPtr a,IntPtr b)
  31. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_set_str(IntPtr a,string b,int c)
  32. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_set_si(IntPtr a,int64 b)
  33. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern int __gmpz_cmp_si(IntPtr a,int64 b)
  34. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern int64 __gmpz_get_si(IntPtr a)
  35. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_abs(IntPtr a,IntPtr b)
  36. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_add(IntPtr a,IntPtr b,IntPtr c)
  37. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_add_ui(IntPtr a,IntPtr b,int64 c)
  38. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_mul(IntPtr a,IntPtr b,IntPtr c)
  39. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_mul_si(IntPtr a,IntPtr b,int64 c)
  40. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_mul_ui(IntPtr a,IntPtr b,int64 c)
  41. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_sub(IntPtr a,IntPtr b,IntPtr c)
  42. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_sub_ui(IntPtr a,IntPtr b,int64 c)
  43. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_ui_sub(IntPtr a,int64 b,IntPtr c)
  44. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_tdiv_q(IntPtr a,IntPtr b,IntPtr c)
  45. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_tdiv_r(IntPtr a,IntPtr b,IntPtr c)
  46. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_tdiv_q_ui(IntPtr a,IntPtr b,int64 c)
  47. [<DllImport(libgmp,CallingConvention=CallingConvention.Cdecl)>]extern void __gmpz_tdiv_r_ui(IntPtr a,IntPtr b,int64 c)
  48.  
  49. let mul(a1:IntPtr,b1:IntPtr,c1:IntPtr,d1:IntPtr,a2:IntPtr,b2:IntPtr,c2:IntPtr,d2:IntPtr) =
  50. let a0=Marshal.AllocHGlobal(bufsiz)
  51. gmp.__gmpz_init(a0)
  52. let b0=Marshal.AllocHGlobal(bufsiz)
  53. gmp.__gmpz_init(b0)
  54. let c0=Marshal.AllocHGlobal(bufsiz)
  55. gmp.__gmpz_init(c0)
  56. let d0=Marshal.AllocHGlobal(bufsiz)
  57. gmp.__gmpz_init(d0)
  58. let t=Marshal.AllocHGlobal(bufsiz)
  59. gmp.__gmpz_init(t)
  60. let u=Marshal.AllocHGlobal(bufsiz)
  61. gmp.__gmpz_init(u)
  62.  
  63. gmp.__gmpz_mul(t,a1,a2)
  64. gmp.__gmpz_mul(u,b1,c2)
  65. gmp.__gmpz_add(a0,t,u)
  66. gmp.__gmpz_mul(t,a1,b2)
  67. gmp.__gmpz_mul(u,b1,d2)
  68. gmp.__gmpz_add(b0,t,u)
  69. gmp.__gmpz_mul(t,c1,a2)
  70. gmp.__gmpz_mul(u,d1,c2)
  71. gmp.__gmpz_add(c0,t,u)
  72. gmp.__gmpz_mul(t,c1,b2)
  73. gmp.__gmpz_mul(u,d1,d2)
  74. gmp.__gmpz_add(d0,t,u)
  75.  
  76. gmp.__gmpz_set(a1,a0)
  77. gmp.__gmpz_set(b1,b0)
  78. gmp.__gmpz_set(c1,c0)
  79. gmp.__gmpz_set(d1,d0)
  80.  
  81. gmp.__gmpz_clear(a0);Marshal.FreeHGlobal(a0)
  82. gmp.__gmpz_clear(b0);Marshal.FreeHGlobal(b0)
  83. gmp.__gmpz_clear(c0);Marshal.FreeHGlobal(c0)
  84. gmp.__gmpz_clear(d0);Marshal.FreeHGlobal(d0)
  85. gmp.__gmpz_clear(t);Marshal.FreeHGlobal(t)
  86. gmp.__gmpz_clear(u);Marshal.FreeHGlobal(u)
  87.  
  88.  
  89. let stdout=libc.fopen("/dev/stdout","w")
  90. let a1=Marshal.AllocHGlobal(bufsiz)
  91. gmp.__gmpz_init(a1)
  92. let b1=Marshal.AllocHGlobal(bufsiz)
  93. gmp.__gmpz_init(b1)
  94. let c1=Marshal.AllocHGlobal(bufsiz)
  95. gmp.__gmpz_init(c1)
  96. let d1=Marshal.AllocHGlobal(bufsiz)
  97. gmp.__gmpz_init(d1)
  98. let a2=Marshal.AllocHGlobal(bufsiz)
  99. gmp.__gmpz_init(a2)
  100. let b2=Marshal.AllocHGlobal(bufsiz)
  101. gmp.__gmpz_init(b2)
  102. let c2=Marshal.AllocHGlobal(bufsiz)
  103. gmp.__gmpz_init(c2)
  104. let d2=Marshal.AllocHGlobal(bufsiz)
  105. gmp.__gmpz_init(d2)
  106.  
  107. gmp.__gmpz_set_si(a1,1L)
  108. gmp.__gmpz_set_si(b1,0L)
  109. gmp.__gmpz_set_si(c1,0L)
  110. gmp.__gmpz_set_si(d1,1L)
  111. gmp.__gmpz_set_si(a2,1L)
  112. gmp.__gmpz_set_si(b2,1L)
  113. gmp.__gmpz_set_si(c2,1L)
  114. gmp.__gmpz_set_si(d2,0L)
  115.  
  116. let mutable N=int(Console.ReadLine())
  117. N<-((N+3)/2)*2
  118. while N>0 do
  119. if N%2>0 then
  120. mul(a1,b1,c1,d1,a2,b2,c2,d2)
  121. mul(a2,b2,c2,d2,a2,b2,c2,d2)
  122. N<-N/2
  123.  
  124. gmp.__gmpz_sub_ui(c1,c1,1L)
  125. gmp.__gmpz_out_str(stdout,10,c1)
  126. libc.fflush(stdout)
  127. libc.puts("")
  128. libc.fflush(stdout)
  129.  
  130. gmp.__gmpz_clear(a1);Marshal.FreeHGlobal(a1)
  131. gmp.__gmpz_clear(b1);Marshal.FreeHGlobal(b1)
  132. gmp.__gmpz_clear(c1);Marshal.FreeHGlobal(c1)
  133. gmp.__gmpz_clear(d1);Marshal.FreeHGlobal(d1)
  134. gmp.__gmpz_clear(a2);Marshal.FreeHGlobal(a2)
  135. gmp.__gmpz_clear(b2);Marshal.FreeHGlobal(b2)
  136. gmp.__gmpz_clear(c2);Marshal.FreeHGlobal(c2)
  137. gmp.__gmpz_clear(d2);Marshal.FreeHGlobal(d2)
  138.  
Success #stdin #stdout 0.06s 24576KB
stdin
2015
stdout
24410294683171395267259945469996127000411199333760853190535535281681195871429510314079442068798555059453792431772087225245168879580469159794544170936403149540819320510882801573596907938222922817134288725100817648047405608500267748766714030468003650259685406411646787207097050545802045736020993909154298598218721111963426993884619351338577630868510716463423585020972878819198991971234596733617320373133963970742975210614208