【ZJOI2011]シネマ(組み合わせ数学/再生テーブル+高精度)

説明

希少な休暇に、白のクラス編成は映画を見に行きます。しかし、休日の映画あまりにも多くの人々に、クラス全体で行うことは困難であるムービーに空想を取った、我々は最終的にリモート小さな路地に映画館を見つけました。映画は、次のように座席を割り当てるのは非常に特別な方法である。しかし1.映画Kの合計を着座し、1の番号が付けられて... K、チケットを購入した後、誰もがランダムに、具体的に、座席が割り当てられます1 ... K媒体は、Lに設定されてランダムに選択された正の整数であってもよいです 席数Lが空の場合2.は、その後、座席は前の手順を続行するために、この人、そうでない場合はLプラス1に割り当てられます。3.座席数Lが第二段階に存在しない場合、人は唯一の映画、いわゆるスタンディングチケットを立って見ることができます。Nクラス白人(白自分自身を含む)の合計は、数学の恋人として、白は全体のクラスは座席の確率があることができます知っていただきたいと思います。

入力

入力ファイルの最初の行は、正の整数であり、Tは、テストデータのグループを表します。2〜T + 1行で、単一のスペースで区切られた各2つの正の整数N、Kは、同じ意味で被写体を記載しました。

出力

出力ファイルには、Tの行が含まれています。2スペースで区切られた整数A、Bを含有すべきであるi番目の行は、データのi番目のグループは/ Bである回答入力ファイルを表します (この要件は既約分数に答えることに注意してください)

サンプル入力

3
1 1
2 1
2 2

サンプル出力

。1 1
0 1
3 4

[データ]範囲
データT <= 50、N、Kの100%まで <= 200

 

実際には、この問題正のソリューションは、テーブルを再生するために法律を見つけることです

まず、分母として、すべてのプログラム番号を入れる必要があり、

どうやら$ K ^ n個の$

また、$ nの>出力01が可能のk $時間を

アイデアは、より多くの不滅です後

私たちはリングにチェーンを回し、最終的な増加で席

したがって、被験者所定の規則に従って、$ nの<k個の$ので、一人一人がダウンし、最終的に座ることができるようになります

誰かが$ K $が座ることができないの席に行っている場合、彼はその席に座っでしょうプラス

だから、いかなる場合にも座って合法的なプログラムプラス席です

この時間は、列の柿を開始することができます

(複雑すぎるとは思わない、座ることができるようになり、とにかく最終的に)座っで$ N $の個人、すべての選挙$ kが+ 1 $、$(K + 1)^ n個の$

なぜなら、自然と(オフすることができ、繰り返すことができる)環の、各順列の計算は、K + 1回

したがって、この部分は、$ \ FRAC {(K + 1)^ n}は{K + 1} =(K + 1)^ {N-1} $です

そして、空番目の$ K-N + 1 $があります

我々は、バックチェーンに伸長位置から切断する最初の$ kの+ 1 $無意味の座席を選択することができます

ANS = $ \ FRAC {(K + 1)^ {N-1}(K-N + 1)} ^ {k個のN} $

いいえ、高精度な成形が明確に右ではありません

(高精度を得るために、低い精子を掛けます)

この質問はまた、出力点の結果について尋ねているあなたは、高精度に加えたい私に教えないでください。

GCDは、ライン上について模索されてきたとき、分母疲れください

(クイック、地獄の力はどのようなもの)

 

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstd;
INT T、N、K、NUM1 [ 10005 ]、NUM2 [ 10005 ]、N1。
ボイド MULT(int型のx、int型A [])
{ 
    int型のk = 0 以下のためにint型 I = 1 ; I <= [ 0 ]; iは++ 
    { 
        int型 TMP = [I] * X + K。
        [I]は、TMPの%= 10 
        K = TMP / 10 
    }
    一方、(K)[++ [ 0 ] = K%10、K / = 10 
} 
int型 GCD(int型のx、int型Y)
{ 
    場合(!y)のリターンX。
    戻り GCD(Y、Xの%のY)。
} 
ボイドワーク()
{ 
    scanf関数(" %d個の%のD "、&​​N&K)。
    memset(NUM1、0はsizeof (NUM1))。
    memset(NUM2、0はsizeof (NUM2))。
    NUM1 [ 0 ] = NUM1 [ 1 ] = NUM2 [0 ] = NUM2は、[ 1 ] = 1 もし(N> K)
    { 
        プット(" 0,1 " )。
        返します
    } 
    N1 = K-N + 1 以下のためにint型 I = 1 ; I <= N- 1、I ++ 
        MULT(K + 1 、NUM1)。
    以下のためにint型私= 1 ; iが<= N; iが++ 
    { 
        int型 = K、GCD =今GCD(K、N1)。
        もし(GCD!= 1
        {  / = GCD。
            N1 / = GCD。
        } 
        MULT(今、NUM2)。
    } 
    MULT(N1、NUM1)。
    以下のためにint型 I = NUM1 [ 0 ]; I; i-- 
        のprintf(" %dの" 、NUM1 [I])。
    printf("  " );
    以下のためにint型 I = NUM2 [ 0 ]; I; i-- 
        のprintf(" %dの" 、NUM2 [I])。
    プット("  " ); 
} 
int型メイン()
{ 
    scanf関数(" %のD "、&T)。
    一方、(T-- )ワーク();
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Rorschach-XR/p/11140888.html