トピックへのリンク:https://www.luogu.org/problem/P1771
より多くの規律したい、ここhttps://gmoj.net/senior/#main/show/1344
メモリ空間の制限の違い。
まず、この質問の観察。
- これは、数学の問題です。(ナンセンス
- xの広い範囲に、高速電力を使用する検討、及び、最大1000である(以下、nと称する)分解の数を尋ねます。
- サイズ制限xの除去後に、問題を識別テンプレート部分を残りの:Nが与えられると、k個の要件は、部分に分割されているパーティション方法。これは、組み合わせの標準の数です。
- = X S = 2 ^(N-1)[6 * S * K /(x ^ 3)] +(6×S)/(X ^ 2)タイプ、:、システムは約ある点のデータが再び範囲検討N + 1(問題は右のこの大きななく、短い場合のようです)、その使用高精度を見つけました
観察の終了。
実装:組合せ数学(再帰的)、高速パワー、高い仕上げ。
式:C(K、X ^ X%1000)
再帰は考えることは比較的容易でなければなりません。今のnを分解することと仮定し、メートルの部分にそれを打破します。今、答えは方法1によって分解点の(数)* :( 1-nのときのポイントシステムの数を)爆発と共に、nは1とn-1に入れます。2とは、その後、一緒に回答(分解法ときに分割数n-2)と、N、N-2に分割されている*ようにと(分解法2によってポイントの数)。2例2に1-N 1およびN-2及び破壊への分解は、添加されるべきであることに留意されたいです。実際には、分割方法のアイデアでなければなりません。
実装の段階。まず、数nを与えるために分解されるXの高速処理能力を使用し、次いで、再帰:部品1に1、2が高いと、1、2、3は、3つの分割された部分にどのように多くのポイントシステムをしている分割されています罰金セーブ。dTで最良[i] [j]はいくつかの部分にすることができる方法I jを表します。なお、パスカルの三角形寄託隣接行列を取り込むためにパスカルの三角形の性質も再帰的であるので、i行jは、I jの数は方法の下位部分に分解されます。
私は、80,000以上の隣接行列キロバイトを持っている場合は、紙面の都合でJizhong OJが、問題を解決する:第二プラスの高精度、まだしばらくの間、ここでは、2つの最初のいくつかを理解しやすいコードのバージョンを置きますそう一緒に圧延配列を有する65536キロバイト(ロス・バレーとは異なり、125メガバイトまで)。(もちろん、のみ65536キロバイト空間隣接行列カードうち、何もアイドル隣接テーブル、高精度の圧力レベル等wは可能です)
コード付き:
#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> する#include <cstdioを> の#define LLロングロング 使用 名前空間STDは、 LL X; int型N-、K、MAXN; LL DT [ 1100 ] [ 110 ]; // 私は、いくつかの(パスカルの三角形Jグループに分割されている INT KSM(int型、LL B、INT のMo) { int型 RET = 1。; 一方、(B) { IF(B&1。)RET = RET *%のMo; = A %*ののMo; B >> = 1 ; } リターンRET; } int型のmain(){ CIN >> KのX; INT N = X%の1000年 ; //は×1000%n乗を見つける N = KSM(N、X、1000年); // 決定するN(N <= 1000)k個の基の組み合わせいくつかに分割 するための(INT I = 1 ; I <= N; I ++は) { DT [I] [ 1。 =] 1。; IF(私は= < K) DT [I] [I] = 1 ; } のために(INT= I 3 ;私は<= N-;私は++)// 理由を知るために最初からパスカルの三角形3を描きます。。 { について(INT J = 2、J <= iがjで&& <= K; J ++)// iがj個のグループに分割されている { DT [I] [J] = dtの[I- 1 ] [J- 1 ] +のDT [I- 1 ] [J]; } } COUT << DT [N-] [K]; }
そして、:
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <CStringの> に#define Lovelive長い長い 使って 名前空間はstdを、 Lovelive X; INTのN、K、MAXN。 チャー DT [ 2 ] [ 101 ] [ 400 ]。 INTら[ 400 ]、BL [ 400 ]、CL [ 400 ]。 int型最初; int型(KSM INT、Lovelive Bを、int型のMO) { int型 RET = 1 。 一方、(B) { もし(B&1。)RET RET = A *%のMo; A = A *%のMo、 B >> = 1 ; } 戻りRET; } int型のmain(){ CIN >> K X; int型 XX = X%千 ; // X 1000%のXX電力見つける N = KSM(XX、X、1000); //は(N <= 1000)k個のグループにn個の組み合わせの数を見つける DT [ 0 ] [ 1。 [] 0 ] = ' 1 ' ; DT [ 0 ] [ 2 ] [ 0 ] =' 1 ' ; のための(int型 iは= 3 ; I <= N; iが++ ) { ため(INT J = 2、J <IがJ <= K &&; jは++)// iはj個のグループに分割されている { dtが[ 1。 [-first] 1 ] [ 0 ] = ' 1 ' ; // 次の効果は、2つの大きな数(ナンセンス追加することで、高精度な動作である のmemsetの(Al、0、はsizeof 、アルミニウム(Al)) のmemset(BL、0、はsizeofをBL( )); のmemset(Clで、0、sizeof (CL))。 // DT [I-1] [J-1]、DT [I-1]を[J]。 INTレナ= STRLEN(DT [最初] [J- 1 ])。 INT LENB = STRLEN(DT [最初] [J])。 用(int型、L = 1、L <=レナ; L ++ ) ら[L] = DT [最初] [J- 1 ] [レナ-L] - ' 0 ' 。 用(int型、L = 1、L <= LENB; L ++ ) BL [L] = DT [最初] [J] [LENB-L] - ' 0 ' 。 int型 lenc = 1、湯=0 ; 一方、(lenc <=レナ|| lenc <= LENB) { CL [lenc] = Alは[lenc] + BL [lenc] + 湯。 湯 = CL [lenc] / 10 。 CL [lenc】%= 10 。 lenc ++ ; } のcl [lenc] + = 優。 もし(CL [lenc] == 0)lenc-- 。 int型フラグ= 0 。 一方、(lenc) { DT [ 1-first] [J] [フラグ] = CL [lenc] + ' 0 ' 。 lenc - ; フラグ ++ ; } } 最初 = 1 - 最初; もし(iは= < k)を [I] [DT [第] 0 ] = ' 1 ' ; } COUT << DT [最初] [K]。 }
OJに補助Jizhongスコア:20分はいじりする、40ポイントは、最適化の余地がありません戦略ACとの間隙には、高精度、60ありません