【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; }