2019 ICPC瀋陽ネットワークゲームJ. GHHマタン

問題

マーチン(マーティン・マーティンの英雄)の奇妙な能力と同様に、GHHは、のいずれかにランダムに出現します\(N \)都市毎朝とお金に変わります(X \)\(RMBくらいのお金が昨日持っていたかに関係なく)。

GHHは、あらゆることを発見\(N \)都市が入り、出て行くための唯一の方法(例えば、都市Aのうち、道路は市内のBさんに接続されているが、道路や都市Aのうち、道路も街Aの道路を入力して接続することができる入力してください)持っています。ある日目覚めた後、GHHは突然実験を行うことを望んでいます。

次の日には、GHHは彼が街で彼が目を覚ますたびに実験しているかどうかを判断させていただきます。そうでない場合、彼は彼が都市から開始し、最終的には自分自身に戻ることができるかどうかを確認するために出て行きます。彼はすでにそれを行っていないか、できれば、彼は夕方まで滞在し、睡眠によって次のランダム市に移動します。この実験は、すべてのまで続き(N \)\都市が行われています。

都市間の距離が非常に遠く離れているので、GHHはバスを利用することを決定します。任意の2つの都市間のバスのコストがある\(1 \) RMB(それはまた、コスト\(1 \)入る道路は、それ自体のうち道路に接続されていることを都市の人民元)と速度が非常に高速です。GHHはGHHは、実験が終了したあらゆる都市から都市自体に戻ることができた確率は何ですか?

注意

場合\(N = 2 \) 都市A及びB内の2つの場合があります。

  1. Bに接続されたA、Bに接続され
  2. Bに接続され

とき(X \)を\すること確率は1/2であるので、すべての都市が、自分自身に戻ることができる唯一の最初のケースでは、1です。とき\(X \)は 2で、どのような場合には、okです。

入力

最初の行は、入力整数\は(T \)テストケースの数を表す(\(T \ル10 ^ 4 \) )。\(2 \) \(T + 1 \)ライン、入力二つの整数\(N \) \(X \)都市の総数と初期マネー(表し\(2≤N≤10^ 6 \を)\(N≤2X≤2)が10 ^ 9 \を×)。\(\和{N} \ル10 ^ 7 \)

出力

各テストケース出力一行は、確率であってもよい(\ / B \) ください出力\(*のINV(B)\ MOD(10 ^ 9 + 7)\) \(INV(b)は、\)の逆数である\(Bの\)

サンプル入力のコピー

3
2 1
2 2 
145 134

サンプル出力のコピー

500000004
1
772215686

理解

質問の意味は、おそらく言っている:Nの都市があり、道のうち一つだけの各都市(浸透、同程度)、1つの都市から別の都市へのドルのために。今、私はその数字は現在、各都市を開始してから必要とされているかわからない確率は何である。この図を取得し、バック市内であることを(Xドルがありますか)?

それは次のとおりです。図の目標は、間違いなく多くのであるオイラー組成図、オイラーは、Xの確率は数あるよりも大きくない、それぞれの長さを求めますか?

解決する

質問の意味の理解によると、私たちは悪い列挙に、このようなグラフを見つけ、条件のすべてを列挙する方が良いマップ満足していない、それは図中Xより大きいオイラー長の存在を探すことです。

トピックリミット\(N \ル2X \)オイラーツアーのX点があることを意味し、何のX + 1つのはありません

明らかに、Xは環、残りの自由な組み合わせの点を形成するように接続ポイントを選択より大きい。

私たちは、Xが長くmより設定されているポイントしたい、\(X <M <N \)

(P(M)= \) \ 長さXオイラー図/図の総数よりも多い量で存在します。

オイラーXの長さ= N図がmから選択される数よりも多い量で存在する\(\タイムズ\) M-。1(リング)完全な配列(開始点が固定されているため、\(\タイムズ\) NM(左完全なアレイのポイント)

\(P(M)= C(M、N)*(M-1)!*(NM)!/ N!= 1 / M \)

そう\(ANS = 1- \和\ limits_ {M> X} ^ N {P(M)} \)

以来\(P(M)\) Nまでは、1E6、接頭辞および保守についてとてもオープン、時間の節約です

コード

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;
const int maxn = 1e6+4;

ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans%mod;
}

ll inv(ll a){
    return qpow(a,mod-2);
}

ll sum[maxn];


int main()
{
    int t;
    ll n,x;
    for(int i = 1; i<maxn;i++){
        sum[i]=(sum[i-1]+inv(i))%mod;
    }
    scanf("%d",&t);
    while(t--) {
        scanf("%lld%lld", &n, &x);
        ll ans=1;
        if(n>x)
            ans = (ans+ mod -(sum[n]-sum[x]))%mod;
        cout<<ans<<endl;
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/tongseli/p/11730445.html