HDU 6432 Problem G. Cyclic(容斥原理)

解释下题意
问这种长度为 n 且本质不同(本质不同是指环上数字的相对位置不同,如 1234 和 2341,3412,4123 都是本质相同的,它们本质上是一个环)的环有多少种。所以打表时可以控制1就在1位置,这样就不会有重复的计数了,然后OEIS一下就能找到这个公式

a(n) = (-1)^n + sum((-1)^k*binomial(n, k)*(n-k-1)!, k=0..n-1)

题解:
考虑使用容斥原理进行计数.
包含至少一个形如 [i, i + 1] 或 [n, 1] 这样的子串的环排列个数是 C(n,1)(n − 2)! 个;
可以推广为包含至少 k(0 ≤ k < n) 个的环排列个数是 C(n,k)(n − k − 1)!,
同时注意到,包含 n 个的环排列个数一定是 1 个.
所以最终答案就是
(−1)^n +∑(k=0,k=n−1)(−1)^k*C(n,k)(n − k − 1)!


#include <bits/stdc++.h>

typedef long long LL;
const int MAXN = 1e5 + 5;
const int MOD = 998244353;

int N;
int fac[MAXN], ifac[MAXN];

int fpm(int base, int exp)
{
    int ret = 1;
    for (; exp; exp >>= 1) {
        if (exp & 1)
            ret = (LL)ret * base % MOD;
        base = (LL)base * base % MOD;
    }
    return ret;
}

void prework()
{
    fac[0] = ifac[0] = 1;
    for (int i = 1; i < MAXN; ++i) {
        fac[i] = (LL)fac[i - 1] * i % MOD;
        ifac[i] = fpm(fac[i], MOD - 2);
    }
}

void solve()
{
    int ans = N & 1 ? MOD - 1 : 1;
    for (int k = 0; k < N; ++k) {
        int t = (LL)fac[N] * ifac[k] % MOD * ifac[N - k] % MOD * fac[N - k - 1] % MOD;
        if (k & 1)
            (ans += MOD - t) %= MOD;
        else
            (ans += t) %= MOD;
    }
    printf("%d\n", ans);
}

int main()
{
    prework();
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &N);
        solve();
    }
    return 0;
}

转载于:https://www.cnblogs.com/ffgcc/p/10546333.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值