• 【弱省胡策】Round #5 Handle 解题报告


    这个题是我出的 sb 题。

    首先,我们可以得到:

    $$A_i = sum_{j=i}^{n}{jchoose i}(-1)^{i+j}B_j$$

    我们先假设是对的,然后我们把这个关系带进来,有:

    $$B_i = sum_{j=i}^{n}{jchoose i}A_j = sum_{j=1}^{n}{jchoose i}sum_{k=j}^{n}{kchoose j}(-1)^{j+k}B_k = sum_{j=i}^{n}B_jsum_{k=i}^{j}{jchoose k}{kchoose i}(-1)^{j+k}$$

    然后有:

    $${jchoose k}{kchoose i} = frac{j!k!}{k!(j-k)!i!(k-i)!} = frac{j!(j-i)!}{(j-i)!(j-k)!i!(k-i)!} = {jchoose i}{j - i choose j - k}$$

    故:

    $$B_i = sum_{j=i}^{n}B_jsum_{k=i}^{j}{jchoose i}{j - ichoose j - k}(-1)^{j+k} = sum_{j=i}^{n}B_j{jchoose i}sum_{k=0}^{j-i}{j - ichoose k}(-1)^k$$

    又因为从一个非空石子堆中选出奇数个石子和偶数个石子的方案总数是一样的,所以有:

    $$sum_{i=0}^{n}{nchoose i}(-1)^i = [n == 0]$$

    故:

    $$B_i = sum_{j = i}^{n}B_j{jchoose i}[i == j] = B_i$$

    发现我们构造的这个关系是没有矛盾的,所以就可以用这个关系来算 $A_i$ 了。

    我们刚才证明了这个关系的充分性,那么必要性呢?

    因为这是一个满秩的 $n$ 元一次方程组,所以有且仅有一组解满足这个关系。

    然而我们现在就找到了这样的一组合法解,所以必要性也是显然的。

    所以我们可以得到这两组关系互为充分必要条件,也就是等价的。

    把式子展开,有:

    $$A_i = sum_{j=i}^{n}frac{j!(-1)^jB_j}{i!(-1)^i(j-i)!}$$

    其中 $frac{1}{i!(-1)^i}$ 我们可以最后再考虑,然后我们令 $T_i = A_{n-i} imes (n-i)! imes (-1)^{n-i}$,那么有:

    $$T_i = sum_{j=n-i}^{n}frac{j!(-1)^jB_j}{(j-n+i)!} = sum_{j=0}^{i}frac{(n-j)!(-1)^{n-j}B_{n-j}}{(i-j)!}$$

    令 $X_i = (n-i)!(-1)^{n - i}B_{n-i}$,$Y_i = frac{1}{i!}$,那么就有:

    $$T_i = sum_{j=0}^{i}X_j imes Y_{i - j}$$

    就可以用 FFT 来算了,算完之后再处理处理就 OK 了。

    时间复杂度 $O(nlog n)$。

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 typedef long long LL;
     8 #define N 262144 + 5
     9 #define Mod 998244353
    10 #define g 3
    11 
    12 int n, d, len, A[N], Fac[N], Inv[N], X[N], Y[N], Rev[N], e[N];
    13 
    14 inline int Inc(int a, int b)
    15 {
    16     return a + b - (a + b >= Mod ? Mod : 0);
    17 }
    18 
    19 inline int power(int u, int v)
    20 {
    21     int res = 1;
    22     for (; v; v >>= 1)
    23     {
    24         if (v & 1) res = (LL) res * u % Mod;
    25         u = (LL) u * u % Mod;
    26     }
    27     return res;
    28 }
    29 
    30 inline void Prepare()
    31 {
    32     Fac[0] = Inv[0] = 1;
    33     for (int i = 1; i <= n + 1; i ++)
    34         Fac[i] = (LL) Fac[i - 1] * i % Mod;
    35     Inv[n + 1] = power(Fac[n + 1], Mod - 2);
    36     for (int i = n; i; i --)
    37         Inv[i] = (LL) Inv[i + 1] * (i + 1) % Mod;
    38 }
    39 
    40 inline void FFT(int *p)
    41 {
    42     for (int i = 0; i < len; i ++)
    43         if (Rev[i] > i) swap(p[i], p[Rev[i]]);
    44     for (int k = 1, s = 1; k < len; k <<= 1, s ++)
    45         for (int i = 0; i < len; i ++)
    46         {
    47             if (i & k) continue ;
    48             int t = (i & k - 1) << d - s;
    49             int u = (LL) e[t] * p[i + k] % Mod;
    50             p[i] = Inc(p[i], u);
    51             p[i + k] = Inc(p[i], Mod - Inc(u, u));
    52         }
    53 }
    54 
    55 int main()
    56 {
    57     #ifndef ONLINE_JUDGE
    58         freopen("handle.in", "r", stdin);
    59         freopen("handle.out", "w", stdout);
    60     #endif
    61     
    62     scanf("%d", &n);
    63     for (int i = 0; i <= n; i ++)
    64         scanf("%d", A + i);
    65     Prepare();
    66     for (len = (n + 1) << 1; len != (len & -len); len += (len & -len)) ;
    67     for (int i = len; i > 1; i >>= 1, d ++) ;
    68     for (int i = 0; i <= n; i ++)
    69     {
    70         X[i] = (LL) A[n - i] * Fac[n - i] % Mod * ((i & 1) ? Mod - 1 : 1) % Mod;
    71         Y[i] = Inv[i];
    72     }
    73     for (int i = 0, w = power(g, (Mod - 1) / len); i < len; i ++)
    74     {
    75         for (int j = 0; j < d; j ++)
    76             if ((i >> j) & 1) Rev[i] += 1 << (d - j - 1);
    77         e[i] = !i ? 1 : (LL) e[i - 1] * w % Mod;
    78     }
    79     FFT(X), FFT(Y);
    80     for (int i = 0, Inv_w = power(power(g, (Mod - 1) / len), Mod - 2); i < len; i ++)
    81     {
    82         X[i] = (LL) X[i] * Y[i] % Mod;
    83         e[i] = !i ? 1 : (LL) e[i - 1] * Inv_w % Mod;
    84     }
    85     FFT(X);
    86     for (int i = 0, Inv_len = power(len, Mod - 2); i < len; i ++)
    87         X[i] = (LL) X[i] * Inv_len % Mod * Inv[n - i] % Mod * ((i & 1) ? Mod - 1 : 1) % Mod;
    88     for (int i = n; ~i; i --)
    89         printf("%d%c", X[i], !i ? '
    ' : ' ');
    90     
    91     #ifndef ONLINE_JUDGE
    92         fclose(stdin);
    93         fclose(stdout);
    94     #endif
    95     return 0;
    96 }
    Handle_Gromah
  • 相关阅读:
    【报错】ES报错找不到Gson类
    【报错】Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    【JUC】AtomicInteger源码
    【Netty】Netty服务启动源码
    【Netty】Netty实现简单RPC
    【Netty】心跳机制
    【Netty】Netty模型
    【Netty】Reactor模型
    C# 好狂的多线程呀
    select使用
  • 原文地址:https://www.cnblogs.com/gromah/p/4586516.html
Copyright © 2020-2023  润新知