[Gdgzezoi]問題C:チェンジ・教室

説明

ちょうど大学牡牛座のために、彼が直面した最初の質問は、実際の状況に応じて右のコースを適用する方法でした。

カリキュラムに選択することができ、n個の期間に2nのカリキュラムのセクションがあります。I(1≤i≤n)期間で、もちろん事前牛肉CI学校の教室内に配置された2つの異なる場所で同時に同じコンテンツ、及び教室ジ内の別のレッスン。

任意のアプリケーションの非提出の場合は、学生が順番に時間順にスケジュールされたすべてのクラスのnセクションを完了する必要があります。学生はi教室のレッスンを変更したい場合は、適用する必要があります。アプリケーションが渡された場合、生徒は教室でそれ以外の場合は、まだi番目の期間のクラスディで教室、CIに行くことができます。

あまりにも多くの教室を交換する必要があるため、アプリケーションは介して取得することができないかもしれません。教室のコースセクションiを置き換えるために、牛肉検索アプリケーションを算出することにより、アプリケーションの確率は互いに独立である確率によって、KI、および各種アプリケーションプログラムのための実数で知られています。

学校の規則は、すべてのアプリケーションは、唯一の学期の開始前に1時間を提出することができ、それぞれの人にのみ適用するには、m個のレッスンまで選択することができます。牛肉は教室メートルのコースを置き換えるために最善の希望を適用することができ、あなたが出て実行することはできません。牛肉は、特定のプログラムの結果の適用上の他のコースに適用するかどうかを決定するのではなく、各レッスン教室の1回の交換に適用するかどうかを決定しなければならないことをこれは意味これは、m個のアプリケーションの機会です、あなたもコースに適用することはできません。

別のコースが異なる教室に配置することができるので、クラスの牛肉の間の時間を使用するので、必要が別の教室に1つの教室から到着しました。日、牛肉の教室は、黒板、近くに次のノート、ノートに白いチョークNデジタル数字0とM 1と書かれた空の教室を見つけ、次の授業の後別の整数K.氏は述べています

しばらくの間観察された牛肉、予想外にK-1は、N + M-1で割り切れることを発見!だから、初めて操作「ボード上のKがランダムに黒板に書かれた新しい番号として消去の数、およびKのこの平均数を選択した」のか疑問に思っ好奇心牛肉は、彼が操作を繰り返しボード上の唯一の数になるまで、どのように多くの可能な値の数。あなたは合理的な数は、黒板に書かれた方法をどのように彼を気にしないので、明らかに、このプロセスでは、黒板上の各数は合理的、牛肉は、スコアについて大学生、学んだ知識です。あなたは、この値が大きすぎるので、彼は、値をカウントすることができますしてください、あなたは単にライン上の109 +モジュロ7の値を必要な。

入力

最初の行の入力は三つの整数N、M、Kが含まれています

出力

ボード上の最後の数字モジュロ109 + 7の可能な値の数を表す出力整数値。

サンプル入力1

2 2 2

サンプル入力2

3 4 3

サンプル入力3

150 150 14
サンプル出力

サンプル出力1

5

サンプル出力2

9

サンプル出力3

937426930

ヒント

最初のサンプルでは、​​5つの可能な値は、1 / 4,3 / 8,1 / 2,5 / 8,3 / 4です。3/8には、以下の方法により得ることができる特徴:

  1. 1/2に書かれた、0と1を拭きます。
  2. 1/2と1を拭き、3/4に書かれました。
  3. 3/8に書かれ、0および3/4を拭きます。

データ範囲:

1≦N、M≤2000、
2≤K≤2000、
K割り切れる。1-N + M-1。

10.サブタスク存在会う1≤N、M、K≤10。
30は、サブタスク(サブタスクに依存しない)、を満たすK = 2が存在します。

思考

今、mは0であり、k進木が有するnは1であり、合計N + m個のリーフノードは、その後、存在する想像する、ルート・ノードのすべての子らのために各非リーフノードの平均値は、最終的に求めていますどのように多くの異なる値プログラム

kの合計数に各非リーフノード対応する、得られた値の両方として明らかに本質的に同じ

深さ1のn個の点の集合をそれぞれA1である...、0の深さB1 ... BM、式を一覧表示したい場合に:
Σni= AI +Σmi= 1K-1K-BI-AI =1Σi= + [シグマ1nk I 1 = = 1MK-BI
次いで溶液を回答するために提供されるzは、そこである:
Z =Σni= 1K-AIZ =ΣL = 1nk-AI
二つの式を結合、我々は、zが条件を満たして見つけます、それの電源として表さn及びk、および1-N MのK乗として表すことができるとすることができる場合に限り
16進数kのZ使用することができる
配置され、Z = 0.c1c2c3 ... CLZ = 0.c1c2c3 ...をCLは
あなたのアカウントに単語の位置を取らない場合、それはあなたがそれのビットに取るそうならば、すべてのC nは?
それは、すべての帯域kとC%ほど長いので、(K-1)== N %は、(K-1) とすることができる
1-zが類似している
、ここでは、所定ことができないCL 0、0、1、CLならためLビットに対応する-z数が0に設定されている、とさえ重いだけL-1ビットの場合
、ここでは、私は、我々はあまりにも多くの問題をすべきではない、主キャリー問題を考える、DPすることができるはずです
が、説明をいただいてもしたいですその後、皮膚の外観の
CLは確かではないゼロ、Lの後、1-zの位置は確かではないゼロ、双方向リットルがなければならないとして
、我々は提案し、このBIを指示
要件が1から0.00 ... 1 =ΣになることをことをNI = 1K-AI +Σmi= 1K-bi1-0.00 ... 1 =Σiは=(K +Σiは= 1MK-BI 1nk-aiが進)
ので考慮ビットの問題になりません
F [i]の[j]を設定する[ 0 / 1]より大きい0/0で(理由はないとの合計以上n以下、モジュロない)小数点の後にこれを行うと、現在のすべてのCまでのi番目のビット(深度i)を表すjは、最後のビットの数
転送は非常に簡単です、あなたは接頭辞と最適化NMを行うことができます

コード

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+77,mod=1e9+7;
int n,m,K,i,j,k,q1,q2;
ll f[2][2077][2],sum[2077];
int ans;
int main()
{
    scanf("%d%d%d",&n,&m,&K);
    m--; K--;
    q1=0;q2=1;
    f[0][0][0]=1;
    for(int i=1; i<=max(n,m)*2; i++)
    {
        for(int j=0; j<=n; j++) sum[j+1]=(sum[j-1+1]+f[q1][j][0]+f[q1][j][1])%mod;
        for(int j=0; j<=n; j++)
        {
            f[q2][j][0]=(sum[j+1]-sum[j-1+1])%mod;
            k=max(0,j-K);
            f[q2][j][1]=(sum[j-1+1]-sum[k-1+1])%mod;
        }
        for(int j=0; j<=n; j++) if(j%K==n%K&&(i*K-j)%K==m%K&&i*K-j<=m) ans=(ans+f[q2][j][1])%mod;
        q1^=1;q2^=1;
    }
    ans=(ans+mod)%mod;
    printf("%d",ans);
}

发布了703 篇原创文章 · 获赞 392 · 访问量 14万+

おすすめ

転載: blog.csdn.net/Eric1561759334/article/details/100836087