【J-Easy Integration】题解(不使用Wallis' Integral版)
这道题先换元后使用Wallis' Integral可以得到通项公式,步骤比较短,这里不再赘述。
这里写一个不使用Wallis' Integral的推导(PS:虽说是不使用Wallis' Integral,实际上还是采用了类似于推导Wallis' Integral的Recurrence relation的思路)
正文:
Let ,
, then
and
.
Let ,
,
, then
,
.
.
Then
.
.
因为目标是写出程序即可,不推通项公式也很好算,这个只需要预先初始化好就可以开始推了。
C++:
#include <bits/stdc++.h>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define scd(x) scanf("%d", &x)
#define scs(x) scanf("%s", x)
#define sclf(x) scanf("%lf", &x)
#define scll(x) scanf("%lld", &x)
#define clr(a, b) memset((a), (b), sizeof(a))
#define fi first
#define se second
typedef long long ll;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
template <class T>
inline T sq(T x) {return x * x;}
const int lim = 1e6 + 10;
const ll mod = 998244353ll;
ll I[lim] = {0, 166374059, 432572553, 591816295}, T[lim];
inline ll add(ll a, ll b) {
return (a + b) % mod;
}
inline ll sub(ll a, ll b) {
return ((a - b) % mod + mod) % mod;
}
inline ll mul(ll a, ll b) {
return a * b % mod;
}
inline ll Div(ll a, ll b) {
static bool doinit = true;
const static int sz = 1e5 + 10;
const static ll p = mod;
static int inv[sz];
if (doinit) {
inv[1] = 1;
for (int i = 2; i < sz; ++i)
inv[i] = (long long)(p - p / i) * inv[p % i] % p;
doinit = false;
}
if (b < sz) {
return (long long)a * inv[b] % p;
} else {
int pw = p - 2;
long long ret = (a % p + p) % p;
do {
if (pw & 1) ret = ret * b % p;
b = (long long)b * b % p;
} while (pw >>= 1);
return ret;
}
}
int main() {
int n;
T[1] = Div(1, 12);
T[2] = Div(1, 60);
loe(i, 3, 1000000) {
I[i] = Div(T[i - 1], add(mul(2, i), 1));
I[i] = mul(I[i], i);
T[i] = sub(T[i - 1], I[i]);
T[i] = mul(T[i], Div(i, mul(2, add(i, 1))));
}
while (~scd(n)) {
printf("%lld\n", I[n]);
}
return 0;
}

京公网安备 11010502036488号