Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/fontdata.js

[hdu6432]Problem G. Cyclic

题目大意:给你n,一种合法的排列为,排列中没有s[i\%n+1]-s[i]==1,求合法方案数

题解:容斥,令f_{i,j}表示有i个元素,至少包含js[i\%n+1]-s[i]==1的方案数,发现f_{n,1}=\binom n 1(n-2)!

推广f_{n,k}=\binom n k(n-k-1)!(令(-1)!==1

\therefore ans = (-1)^n + \sum_{k = 0}^{n - 1} (-1)^k \binom{n}{k} (n - k - 1)!

卡点:

 

C++ Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstdio>
#define maxn 100010
const long long mod = 998244353;
int Tim, n;
long long FAC[maxn + 1], inv[maxn], *fac = &FAC[1], ans;
long long C(long long a, long long b) {
    if (a < b) return 0;
    return fac[a] * inv[b] % mod * inv[a - b] % mod;
}
int main() {
    scanf("%d", &Tim);
    fac[-1] = fac[0] = fac[1] = inv[0] = inv[1] = 1;
    for (int i = 2; i <= 100000; i++) {
        fac[i] = fac[i - 1] * i % mod;
        inv[i] = inv[mod % i] * (mod - mod / i) % mod;
    }
    for (int i = 2; i <= 100000; i++) inv[i] = inv[i] * inv[i - 1] % mod;
    while (Tim --> 0) {
        scanf("%d", &n);
        ans = 0;
        for (int i = 0; i <= n; i++) {
            ans = (ans + ((i & 1) ? -1ll : 1ll) * C(n, i) * fac[n - i - 1] % mod) % mod;
        }
        if (ans < 0) ans += mod;
        printf("%lld\n", ans);
    }
    return 0;
}

 

posted @   Memory_of_winter  阅读(149)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
点击右上角即可分享
微信分享提示