2019 ICPC 沈阳网络赛 J. Ghh Matin

Problem

Similar to the strange ability of Martin (the hero of Martin Martin), Ghh will random occurrence in one of \(N\) cities every morning and the money will change to \(X\) RMB (No matter how much money had yesterday).

Ghh finds that every \(N\) cities have only one way to enter and go out (for example, city A's out road is connected with city B's enter road, or city A's out road may also be connected with city A's enter road). After waking up one day, Ghh suddenly wants to do an experiment.

In the following days, Ghh will judge whether he has experimented in the city every time he wakes up. If not, he will go out to see if he can start from the city and finally return to itself. If he can't or has already done it, he will stay until the evening and go to the next random city by sleeping. This experiment lasts until every \(N\) cities have been done.

Because the distances between cities are very far, Ghh decides to take bus. The cost of bus between any two cities is \(1\) RMB (it also costs \(1\) RMB for the city that the enter road is connected with the out road of itself) and the speed is very fast. What is the probability that Ghh can return to the city itself from every city when Ghh has finished the experiment?

Note

When \(n=2\), there are two cases in city A and B:

  1. A connected with A, B connected with B
  2. A connected with B

When \(X\) is 1, only in the first case every city can return to itself, so the probability is 1/2. When \(X\) is 2, any case is ok.

Input

The first line, input a integer \(T\) represents the number of test cases (\(T \le 10^4\)). Next \(2\) ~ \(T+1\) line, input two integers \(N\), \(X\) represents the total number of cities and initial money (\(2≤N≤10^6\),\(N≤2X≤2×10^9\)). \(\sum{N} \le 10^7\).

Output

Each test case output one line, the probabilities may be \(a/b\), please output \(a*inv(b)\mod (10^9+7)\). \(inv(b)\) is the inverse of \(b\).

样例输入复制

3
2 1
2 2 
145 134

样例输出复制

500000004
1
772215686

Comprehension

题意大概是说:有n个城市,每个城市只有以一种进出方式(入度、出度相同),从一个城市去另一个城市要1块钱。现在不知道这个图是什么样的,现在需要能从每个城市出发(有X块钱)能回到该城市,得到这样的图的概率是多少?

也就是说:目标的图肯定是很多欧拉回路组成的图,问每条欧拉回路的长度都不大于X的概率是多少?

Solve

根据对题意的理解,我们发现不好枚举这样的图,不如去枚举所有不满足该条件的图,也就是说去找存在欧拉回路长度大于X的图。

题目限制了\(N\le 2X\) ,这就是说有X点的欧拉回路,就没有X+1的

很显然,选出大于X个点连成环,剩下点自由组合。

我们不妨设大于X个点是m,\(X<m<N\)

\(P(m)=\)存在欧拉回路长度大于X的图的数量/总图数

存在欧拉回路长度大于X的图的数量=N个里面选m个 \(\times\) m-1(环内)的全排列(因为起点是固定的 \(\times\) n-m(剩下的点)的全排列

\(P(m)=C(m,N)*(m-1)!*(N-m)!/N!=1/m\)

所以\(ans=1-\sum\limits_{m>X}^N{P(m)}\)

因为\(P(m)\) 最大到N,是1e6,所以开个前缀和维护一下,省时间

Code

#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
今日推荐