JZOJ5164 [6.25] NOIP2017はCFを行うにはほとんどのアナログ

タイトル

説明

CLJ A CFで、最近はほとんど関係狂気を超える評価をターゲットCFが試合10分前には非常に素晴らしい事前選択の問題のうち、このことを言って、10分を必要とし、CFに参加するために、この問題をうまくしなければなりません
この質問は、同じライン上の任意のデータではない2つの障害物は、任意の二つの障害は、この行列にNに作品を置くためにあなたを求めて、同じ列でないことを確認するために、各行は障壁を持っている、あなたにN * N行列を与え、これです(位置の障害物が作品を置くことができない)、また、プログラムのどのように多くの種類を見つけ、すべての行に各列のための唯一の制限だけのポーン、ポーン満たすN個を配置するかを尋ねます。
神はあらゆる種類の問題は最近、非常に厳しい戦いを拷問少しの水問題へのこのスーパーこだわっている錯乱であるが、これは、彼があなたを見つけたので、エッジの効いたCLJを超える最高の機会です、あなたは彼を取りますCFは成功し、今レースに参加します。

入力

最初のラインN、次のN * N行列。

出力

法律上のプログラムの数。

サンプル入力

2
0 1
1 0

サンプル出力

1

データ制約

ことを確保するため、データの20%N <= 10
データの60%ことを確実にするために:N <= 20である
ことを確実にするために、データの100%:N <= 200

問題の解決策

+ 20%BLAST検索プルーン

欺くポイントを剪定+ 60%より良いバーストサーチ(このテストは、このタイトルの人物ビンを果たしていないので、手の届かない方法はありません)

2つの方法があり、100%は、1が問題に元の溶液で、1はこの試験方法の人々のタイトルです。

法1:式の間違った行(Baiduの百科事典から貼り付け)

漸化式

\(N- \)で番号付け要素(\ \ N-)位置番号が複数、各要素番号は位置番号の方法で対応していない\(D(n)が\)を表し、次いで\(D(n-1の)\)と言う)(N-1 \ \の要素番号\(N-1 \) ように互いの方法の数に対応しない番号の位置。

第一工程、第\(\ N-)このような位置のような位置にある要素\(K \)の合計\(N-1 \)方法。

第二段階は、k個の要素を入れ、その後、2つのケースがあります。

  1. 残りのために、次に、位置Nに置く\(N-1 \)の位置にk番目の要素ので、素子(\ N-)\、残り\(N-2 \)要素が有します\(D(N-2) \) の方法。
  2. K番目の要素は、位置に入れていない\(N- \) この時間は、これらのために\(N-1 \)要素がある\(D(N-1) \) の方法。

要約すると得られ

\(D(N)=(N-1)[D(N-2)+ D(N-1)] \)

中でも、\(D(1)= 0、D(2)= 1 \)

再帰関係によって、この用語の式の以下の導出:

便宜上、聞かせて\(D(K)= K!N(K)、K = 1、2、...、N- \)

\(N(1)= 0、N(2)1/2 = \)

\(N≥3 \)时、\(N!N(N)=(N-1)(N-1)!N(N-1)+(N-1)!N(N-2)\)

\(NN(T)=(N-1)はO(n-1)+ O(N-2)\)

そして、そこに

\(N(N) - N(N-1)= - [N(N-1)、 - N(N-2)] / N =(-1 / N)-1 /(N-1)] [ -1 /(N-2)] ...(-1/3)[N(2) - N(1)] =( - 1)^ N / N \)!

故に

\(N(N-1)! - N(N-2)=(-1)^(N-1)/(N-1)、\) $

\(N(2) - N(1)=(-1)^ 2/2 \!)

追加、利用可能

\(N(N)=(-1)^ 2月2日!+ ... +(-1)^(N-1)/(N-1)!+(-1)^ N / N!\)

故に

\(D(N)= N![(-1)^ 2/2] + ... +(-1)^(N-1)/(N-1)!+(-1)^ N / N!] \)

すなわち間違った行式。

(简化:\(F [I] =(I-1)*(F [I-2])\)+ [I-1] F

包除原理

包除原理でも式の間違った行を起動することができます。

1の正の整数で、2、3、...、N k個のk番目のビットを有するように配置されているNの完全な配列を有し、(N-1)のタイプ; !!が......、K 1、2、3としました、 N、欲求は、いくつかの千鳥ため、それは構成を減算しなければならないれているので、N×(N-1)の合計は、少なくとも一箇所の順列である;!今回二つのオペランド同時に良好除外マルチの配置、構成する必要があります。アップ同じ時間に3行が複数回構成するように配置されているかなりの数がある場合、除外されるべきである; ......;配列行の数間違った種類を取得するには、このプロセスを継続あります

\(D(N)= N - !N / 1 + N / 2 - !!!!!!!!N / 3 + ... +(-1)^ n個の* nの/ N =Σ(k = 2〜n個)(-1)^ kの*のn!/ kの!\)

その\(D(N)= N ![1/0! - + 1/2 1/1 - !!!! 1/3 + 1/4 + ... +(-1)^ N / N!] \)

二項反転

私たちは、一般的な用語の式を導出する二項反転単純に使用しています。

順序は考えてみましょIMG表しIMG、任意の数字を入れたプログラムの数をIMG示すIMG桁数を列挙することによって得ることは容易それらの位置にありませんが、数字がその場所にプログラムにカウントされません。

IMG

二項反転して得られました

IMG

ノートIMG、私たちは一般的な用語の彼の式を得た、ことにより、IMGあなたは一般的な用語のための単純な式を得ることができますし、組み合わせの数を拡大します

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, w[210][500], p[500], q[500], len = 1, l, k1;
void jia(int k)
{
    memset(q, 0, sizeof q);
    for (int i = 1; i <= len; i++)
        q[i] = w[k - 2][i] + w[k - 1][i];
    for (int i = 1; i <= len; i++)
    {
        q[i + 1] += q[i] / 10;
        q[i] %= 10;
    }
    while (q[len + 1]) len++;
}
void cheng(int k)
{
    jia(k);
    l = 0, k1 = k;
    memset(p, 0, sizeof p);
    while (k1 >= 10)
    {
        p[++l] = k1 % 10;
        k1 /= 10;
    }
    if (k1) p[++l] = k1;
    for (int i = 1; i <= len; i++)
        for (int j = 1; j <= l; j++)
            w[k][i + j - 1] += q[i] * p[j];
    for (int i = 1; i < len + l; i++)
    {
        w[k][i + 1] += w[k][i] / 10;
        w[k][i] %= 10;
    }
    len = len + l - 1;
    while (w[k][len + 1]) len++;
}
int main()
{
    memset(w, 0, sizeof w);
    scanf("%d", &n);
    w[1][1] = 1;
    w[2][1] = 2;
    for (int i = 3; i < n; i++) cheng(i);
    for (int i = len; i >= 1; i--) printf("%d", w[n - 1][i]);
    printf("\n");
    return 0;
}

アクトII:人々の経験の問題の解決

モデル変換に基づいて見つけることができ、プログラム用のブランクボードの数は見つけることが非常に簡単で、かつ障壁でチェッカーボード方式が包除原理によって達成することができる(すなわち、合計マイナス2枚の壁の上に戻って一緒に作品を置きます放電(組み合わせの数を前処理バリア......)に起因したとき選択された位置に障害物)を、次式を用いて:(導出することができる\(N- \)ライン\ N- \)(カラム、\(m個\)番目障害)\([シグマアンス=(-1)* I *はC IMニッケル(Ni)!\)(\ (Iは\) 0から列挙障害番号\(m個\)

おすすめ

転載: www.cnblogs.com/featherZHY/p/11334062.html