移动端 Banners
P11253 [GDKOI2023 普及组] 小学生数学题
483 字
2 分钟
P11253 [GDKOI2023 普及组] 小学生数学题
Done
您已获得最佳的阅读体验!
题目地址:P11253
题目难度:普及/提高+
题目来源:广东 2023
求出和式
的值,
开始我以为这只是一道快速幂的大水题,
注意到维护阶乘的复杂度是
又发现线性筛在筛去合数时有一个乘积的形式,于是我们可以借用这个思路,在筛去合数的同时维护这个函数。
#include <bits/stdc++.h>#define MOD 998244353#define N 20000010using namespace std;
typedef long long ll;
int n, k;int cnt = 0;ll prime[N], p[N];bool st[N];
ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res % MOD;}
ll inv(ll x) { return qpow(x, MOD - 2);}
void sieve() { p[1] = 1; for (int i = 2; i <= n; i++) { if (!st[i]) { prime[++cnt] = i; p[i] = inv(qpow(i, k)); } st[i] = true; for (int j = 1; i * prime[j] <= n; j++) { if (prime[j] > p[i] || j > cnt) break; st[i * prime[j]] = true; p[i * prime[j]] = p[prime[j]] * p[i] % MOD; // 维护积性函数 if (i % prime[j] == 0) break; } }}
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> k; sieve(); ll fac = 1; ll ans = 0; for (int i = 1; i <= n; i++) { fac = fac * i % MOD; // 线性维护阶乘 ans = (ans + fac * p[i] % MOD) % MOD; // 计算 } cout << ans << endl; return 0;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
P11253 [GDKOI2023 普及组] 小学生数学题
https://justpureh2o.cn/articles/11253/ 相关文章 智能推荐
1
洛谷 陌路寻诗礼 题解
题解 2024-02-19
2
P11280 - Jom & Terry 题解
题解 2024-11-16
3
CF 126D - Fibonacci Sums 题解
题解 2024-10-31
4
CF 755D - PolandBall and Polygon 题解
题解 2024-11-27
5
P6669 - [清华集训2016] 组合数问题 题解
题解 2024-09-28
随机文章 随机推荐