1 条题解

  • 0
    @ 2025-7-31 12:48:51

    Part 0

    hi=i×sih_i=i \times s_i,可以发现 $W=h_1\times h_2\times \ldots\times h_n=1 \times s_1 \times 2 \times s_2 \times \ldots \times n \times s_n=(1 \times 2 \times \ldots \times n) \times (s_1\times s_2\times \ldots\times s_n)=n! \times (s_1\times s_2\times \ldots\times s_n)$。

    由于 n107n \le 10^7,阶乘部分可以预处理。下面只讨论如何求 s1×s2××sns_1\times s_2\times \ldots\times s_n

    Part 1

    先来模拟一下样例第 44 组数据:

    i\color{blue}i 1\color{blue}1 2\color{blue}2 3\color{blue}3 4\color{blue}4 5\color{blue}5 6\color{blue}6 7\color{blue}7 8\color{blue}8 9\color{blue}9 10\color{blue}10
    sis_i 66 33 2\color{red}2
    hih_i 66 88 1010 1212 1414 1616 1818 2020

    再来模拟一下样例第 55 组数据:

    i\color{blue}i 1\color{blue}1 2\color{blue}2 3\color{blue}3 4\color{blue}4 5\color{blue}5 6\color{blue}6 7\color{blue}7 8\color{blue}8 9\color{blue}9 10\color{blue}10 11\color{blue}11 12\color{blue}12 13\color{blue}13 14\color{blue}14 15\color{blue}15 16\color{blue}16 17\color{blue}17 18\color{blue}18 19\color{blue}19 20\color{blue}20 21\color{blue}21 22\color{blue}22 23\color{blue}23
    sis_i 4444 2222 1515 1212 1010 99 88 7\color{red}7
    hih_i 4444 4545 4848 5050 5454 5656 6363 7070 7777 8484 9191 9898 105105 112112 119119 126126 133133 140140 147147 154154 161161

    Part 2

    不难发现,当 siis_i \le i 时,sis_i 便不再变化了。

    证明:

    siis_i \le i,则:

    hi=i×sih_i=i \times s_i hii+1=i×sii+1\dfrac{h_{i}}{i+1}=\dfrac{i \times s_i}{i+1}
    siis_i \le i sii11s_i-i-1 \le -1 sii1<0s_i-i-1<0
    $$s_i = \dfrac{i \times s_i + s_i}{i+1} > \dfrac{i \times s_i}{i+1}>\dfrac{i \times s_i+s_i-i-1}{i+1}=s_i-1 $$si>i×sii+1>si1s_i>\dfrac{i \times s_i}{i+1}>s_i-1 si>hii+1>si1s_i>\dfrac{h_{i}}{i+1}>s_i-1 hii+1=si\lceil \dfrac{h_{i}}{i+1} \rceil=s_i si+1=sis_{i+1}=s_i

    sis_i 不再变化。

    Part 3

    此外,当这个时刻到来时,i2ai \le \sqrt{2a}

    证明:

    siis_i \le i 等价于 hii2h_i \le i^2。设 f(i)=hif(i)=h_ig(i)=i2g(i)=i^2d(i)=f(i)g(i)d(i)=f(i)-g(i),则 f(1)=af(1)=ag(1)=1g(1)=1d(1)=a1d(1)=a-1siis_i \le i 等价于 d(i)0d(i)\le0

    ii 增加 11(即设 j=i+1j=i+1)时,g(j)g(i)=2j1g(j)-g(i)=2j-1

    显然:

    hijhij<1\lceil \dfrac{h_{i}}{j} \rceil-\dfrac{h_{i}}{j}<1 $$\lceil \dfrac{h_{j-1}}{j} \rceil \times j-\dfrac{h_{i}}{j} \times j<j $$hjhi<jh_j-h_i<j f(j)f(i)<jf(j)-f(i)<j f(j)f(i)j1f(j)-f(i)\le j-1

    故 $d(j)-d(i)=[f(j)-g(j)]-[f(i)-g(i)]=[f(j)-f(i)]-[g(j)-g(i)]\le (j-1)-(2j-1)=-j$,即 d(j)d(i)jd(j)-d(i)\le-j

    也就是说,当 ii 增加到 j=i+1j=i+1 时,dd 函数的值至少减小 jj

    i=2ai=\sqrt{2a} 时,$d(i)=a-1-2-3-\ldots-\sqrt{2a}=a-\dfrac{(1+\sqrt{2a})\times \sqrt{2a}}{2}=-\sqrt{\dfrac{a}{2}}<0$,显然这个时刻已经到来。

    Part 4

    于是,我们暴力计算 s1s2as_1 \sim s_{\sqrt{2a}},剩下的上快速幂就行了。

    最终的时间复杂度为 O(n+Ta)O(n+T\sqrt{a}),空间复杂度为 O(n)O(n)

    提示:代码中 $\lfloor\dfrac{(a+1)\times (i-1)}{i}\rfloor=\lfloor\dfrac{a\times (i-1)+(i-1)}{i}\rfloor=\lceil\dfrac{a\times (i-1)}{i}\rceil$。

    Part 5

    std:

    #include <bits/stdc++.h>
    using namespace std;
    const int P = 1e9 + 7, N = 1e7 + 12, Real_N = 1e7;
    int power(int a, int b, int p)
    {
        if (b == 1) return a;
        int x = power(a, b >> 1, p);
        x = 1ll * x * x % p;
        if (b & 1) x = 1ll * x * a % p;
        return x;
    }
    int fc[N];
    void preset()
    {
        fc[0] = 1;
        for (int i = 1; i <= Real_N; i++)
            fc[i] = 1ll * fc[i - 1] * i % P;
    }
    int main()
    {
        preset();
    	int T;
        cin >> T;
        while (T--)
        {
            int n, a, i;
            cin >> n >> a;
            long long W = a;
    	    for (i = 2; i <= n; i++)
    	    {
    		    a = (a + 1) * (i - 1) / i;
    		    W *= a, W %= P;
    		    if (a <= i) break;
    	    }
    	    if (i < n) W *= power(a, n - i, P), W %= P;
    	    cout << W * fc[n] % P << endl;
        }
    	return 0;
    }
    
    • 1

    信息

    ID
    242
    时间
    2000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者