登录—专业IT笔试面试备考平台_牛客网
题意:
思路:
首先是个计数问题,考虑组合数学
组合数学就是在考虑枚举所有包含1和n的区间
这个典中典就是枚举1和n的位置然后算贡献
双指针超时,考虑推式子:
Code:
#include <bits/stdc++.h>
#define int long long
using i64 = long long;
using namespace std;
constexpr int N = 1e6 + 10;
constexpr int M = 1e6 + 10;
constexpr int mod = 998244353;
int Fac[N];
int qpow(int a, int b) {
int res = 1ll;
while(b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void solve() {
int n;
cin >> n;
if (n == 1) {
cout << 1 << "\n";
return;
}
Fac[0] = 1;
for (int i = 1; i <= n; i ++) Fac[i] = (Fac[i - 1] * i) % mod;
int ans = 0;
int inv2 = qpow(2, mod - 2);
for (int i = 2; i <= n; i ++) {
ans += (i * (i - 1) % mod * inv2 % mod) % mod * (n - i + 1) % mod;
ans %= mod;
}
cout << (ans * Fac[n - 2] % mod * 2 % mod) % mod << "\n";
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
while(t --) {
solve();
}
return 0;
}