【P3885】方程式の解(より詳細な)

トピックへのリンク:https://www.luogu.org/problem/P1771

より多くの規律したい、ここhttps://gmoj.net/senior/#main/show/1344

メモリ空間の制限の違い。


 

説明

  アリソンは、あなたが解決するために、問題に走りました。K> = 2及びk∈N*、xは正の整数であり、G(X)= X ^ X MOD 1000(すなわち、XXで割っある不定方程式A1 + A2 + ... + AK-1 + AK = G(x)は、用1000の残り)、X、kは所定の数です。我々が求めるすべてが正の整数解グループ不定方程式の数ということです。例えば、K = 3、X = 2、それぞれ(A1、A2、A3)=(2,1,1)、(1,2,1)、(1,1,2)。
 

入力

  ファイルを入力し、唯一のライン、後にKスペースで区切られた2つの正の整数、Xを持っています。

出力

  出力ファイルは、唯一のライン、正の整数解群方程式の数を有しています。
 

サンプル入力

3 2

サンプル出力

3

まず、この質問の観察。

  1. これは、数学の問題です。(ナンセンス
  2. xの広い範囲に、高速電力を使用する検討、及び、最大1000である(以下、nと称する)分解の数を尋ねます。
  3. サイズ制限xの除去後に、問題を識別テンプレート部分を残りの:Nが与えられると、k個の要件は、部分に分割されているパーティション方法。これは、組み合わせの標準の数です。
  4. = 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で、0sizeof (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ありません

おすすめ

転載: www.cnblogs.com/snowysniper/p/11402777.html