武汉大学2023年新生程序设计竞赛

H - 雪菜的式子

https://ac.nowcoder.com/acm/contest/66651/H

1s / 512MB

题目

雪菜定义 S(n) 为前 n 个质数任意幂次方相乘和 1 构成的集合,例如 S(2)={1,2a,3b,2a×3b}(a,bN).

f(n)=a1S(n)a2S(n)akS(n)μ(i=1kai)

其中 μ 为莫比乌斯函数。

μ(n)={1,n=1(1)k,n=p1p2pk,pi0,n1

给定 n,k,求 f(n),答案对 998244353 取模。

输入

第一行两个数 n,k (1n,k<998244353)

输出

一个整数表示答案。

样例

输入

2 2

输出

1

题解

本题需要将原问题转化一下,转化后的问题就很好求解了。

首先要对 μ(n) 做一下转换,该函数的描述可以变成:

μ(n)={(1)k,nk,100,

因此,拆分结果每种质数的幂次不能 >1,否则 μ(n) 直接变成 0,这一项就不考虑了。

接下来,就可以对不同的 μ(x) 进行分类讨论了:

  • μ(x)=(1)0x 包含 0 种质数,选法 Cn0,这 0 个质数分给 a1ak 组合,有 k0 种安排方式
  • μ(x)=(1)1x 包含 1 种质数,选法 Cn1,这 1 个质数分给 a1ak 组合,有 k1 种安排方式
  • μ(x)=(1)2x 包含 2 种质数,选法 Cn2,这 2 个质数分给 a1ak 组合,有 k2 种安排方式
  • μ(x)=(1)nx 包含 n 种质数,选法 Cnn,这 n 个质数分给 a1ak 组合,有 kn 种安排方式

那么,最终答案便是:

i=0nCniki(1)i

根据二项式定理:

(a+b)n=i=0nCniaibni

原式可以变形:

i=0nCniki(1)i=(1)2ini=0nCniki(1)ni=(1)n(k1)n

最后,使用快速幂即可解决。

需要注意的是,不要将 1k1 并到一起再用快速幂,负数不能用快速幂。

另外取模时,需要注意正负性。

代码

#include <bits/stdc++.h>
#define endl '\n'
#define int long long

using namespace std;

const int MOD = 998244353;

int qpow(int a, int b)
{
    int ans = 1;
    a %= MOD;
    while (b)
    {
        if (b % 2)
            ans = ans * a % MOD;
        a = a * a % MOD;
        b /= 2;
    }
    return ans;
}

void solve()
{
    int n, k;
    cin >> n >> k;
    int ans = qpow(k - 1, n);
    if (n % 2)
        ans *= -1;
    ans = (ans % MOD + MOD) % MOD;
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}