私はプログラミングコンテストの予備問題を解決しようとしています.2つの問題では、非常に大きな整数(100!、2^100など)を計算して出力する必要があります。
また、この大きな整数の累乗を計算する高速な方法も必要です。
これについていくつかのアルゴリズムまたはデータ構造についてアドバイスしてもらえますか?
編集:二乗法とビットシフトによるべき乗は電力に対して機能すると思いますが、この int の階乗を計算する高速な方法も必要です。ありがとう。
EDIT2:興味のある方へ。
長さ N のすべてのビット文字列を含む最短のビット文字列の長さを見つけます (英語で申し訳ありませんが、例を挙げます)。N <= 10000
たとえば、長さ 2(00、01、10、11) のビット列をすべて含む最短のビット列長は 5(11001) です。
この問題に対する私の解決策は 2^n + n - 1 でした (したがって、2 の累乗を計算する必要があります。ビットシフトを使用すると思います)。
もう 1 つの問題は、2 つの長さが与えられた場合に、長さ N に到達する方法の数を見つけることです。 2+2+2+2、2+2+3+3、3+2+2+3、3+3+2+2...)。1 <= N < 2^63。mod 1000000007 で anwser を計算します。
私の解決策は、 2x + 3y = N なので、 x = (N - 3y) / 2 でした。y が 0 から 2*N / 3 の場合、x が整数の場合、この X と Y の一般化順列を合計 += (x+y) で計算する必要があります。/ (x!*y!)。