伯努利数(详解 + 例题 :P3711 仓鼠的数学题)

伯努利数

定义Sk(n)=∑i=0n−1ikS_k(n) = \sum\limits_{i = 0} ^{n - 1} i ^ kSk(n)=i=0n1ik

从二项式出发

(0+1)k+1=∑i=0kCk+1i0i+0k+1⋮(n−1+1)k+1=∑i=0kCk+1i(n−1)i+(n−1)k+1把次方k+1的移项,再整体相加,得nk+1=∑i=0kCk+1iSi(n)nk+1=∑i=0k−1Ck+1iSi(n)+(k+1)Sk(n)Sk(n)=1k+1(nk+1−∑i=0k−1Ck+1iSi(n))(0 + 1) ^ {k + 1} = \sum_{i = 0} ^{k} C_{k + 1} ^{i} 0 ^ {i} + 0 ^{k + 1}\\ \vdots\\ (n - 1 + 1) ^{k + 1} = \sum_{i = 0} ^{k} C_{k + 1} ^{i} (n - 1) ^{i} + (n - 1) ^{k + 1}\\ 把次方k + 1的移项,再整体相加,得\\ n ^{k + 1} = \sum_{i = 0} ^{k} C_{k + 1} ^{i} S_i(n)\\ n ^{k + 1} = \sum_{i = 0} ^{k - 1} C_{k + 1} ^{i} S_i(n) + (k + 1) S_k(n)\\ S_k(n) = \frac{1}{k + 1}\left(n ^{k + 1} - \sum_{i = 0} ^{k - 1} C_{k + 1} ^{i} S_i(n) \right)\\ (0+1)k+1=i=0kCk+1i0i+0k+1(n1+1)k+1=i=0kCk+1i(n1)i+(n1)k+1k+1nk+1=i=0kCk+1iSi(n)nk+1=i=0k1Ck+1iSi(n)+(k+1)Sk(n)Sk(n)=k+11(nk+1i=0k1Ck+1iSi(n))
于是我们有了一个O(n2)O(n ^ 2)O(n2)递推求Si(n)S_i(n)Si(n)得算法,

对二项式再进一步考虑:

(0+m)k=∑i=0kCki0imk−i⋮(n−1+m)k=∑i=0kCki(n−1)imk−i左右两边同时相加Sk(n+m)−Sk(m)=∑i=0kCkiSi(n)mk−i左右两边对n求导Sk′(n+m)=∑i=0kCkiSi′(n)mk−in=0,代入Sk′(m)=∑i=0kCkiSi′(0)mk−i两边对m从0−>n求积分Sk(n)−Sk(0)=∑i=0kCkiSi′(0)nk−i+1k−i+1−∑i=0kCkiSi′(0)0k−i+1k−i+1Sk(0)=0,对于最右侧i≠k+1,所以0k−i+1=0Sk(n)=∑i=0kCkiSi′(0)nk−i+1k−i+1=1k+1∑i=0kCk+1iSi′(0)nk+i−1(0 + m) ^{k} = \sum_{i = 0} ^{k} C_{k} ^{i} 0 ^{i} m ^{k - i}\\ \vdots\\ (n - 1 + m) ^{k} = \sum_{i = 0} ^{k} C_{k} ^{i}(n - 1) ^{i} m ^{k - i}\\ 左右两边同时相加\\ S_k(n + m) - S_k(m) = \sum_{i = 0} ^{k} C_{k} ^{i} S_{i} (n) m ^{k - i}\\ 左右两边对n求导\\ S'_k(n + m) = \sum_{i = 0} ^{k} C_{k} ^{i} S'_i(n) m^{k - i}\\ \\ n = 0,代入\\ S'_k(m) = \sum_{i = 0} ^{k} C_{k} ^{i} S'_i(0) m^{k - i}\\ 两边对m从0->n求积分\\ S_k(n) - S_k(0) = \sum_{i = 0} ^{k} C_{k} ^{i} S'_i(0) \frac{n ^{k - i + 1}}{k - i + 1} - \sum_{i = 0} ^{k} C_{k} ^{i} S'_i(0) \frac{0 ^{k - i + 1}}{k - i + 1}\\ S_k(0) = 0, 对于最右侧i \neq k + 1,所以0 ^{k - i + 1} = 0 \\ S_k(n) = \sum_{i = 0} ^{k} C_{k} ^{i} S'_i(0) \frac{n ^{k - i + 1}}{k - i + 1} = \frac{1}{k + 1} \sum_{i = 0} ^{k} C_{k + 1} ^{i} S'_i(0) n ^{k + i - 1}\\ (0+m)k=i=0kCki0imki(n1+m)k=i=0kCki(n1)imkiSk(n+m)Sk(m)=i=0kCkiSi(n)mkinSk(n+m)=i=0kCkiSi(n)mkin=0Sk(m)=i=0kCkiSi(0)mkim0>nSk(n)Sk(0)=i=0kCkiSi(0)ki+1nki+1i=0kCkiSi(0)ki+10ki+1Sk(0)=0,i=k+1,0ki+1=0Sk(n)=i=0kCkiSi(0)ki+1nki+1=k+11i=0kCk+1iSi(0)nk+i1
其实,这里的Si(0)S_i(0)Si(0)就是伯努利数,为了方便书写,Bi=Si′(0)B_i = S'_i(0)Bi=Si(0)
我们先将n=1代入上式Sk(1)=1k+1∑i=0kCk+1iBi同样的我们把右边的最高项给提出来Sk(1)=1k+1∑i=0k−1Ck+1iBi+Bk则有Bk−Sk(1)=−1k+1∑i=0k−1Ck+1iBi特殊地,考虑k=0,有S0(1)=1,所以B0=1k≥1,Sk(1)=0,所以Bk=−1k+1∑i=0k−1Ck+1iBi我们先将n = 1代入上式\\ S_k(1) = \frac{1}{k + 1} \sum_{i = 0} ^{k} C_{k + 1} ^{i} B_i\\ 同样的我们把右边的最高项给提出来\\ S_k(1) = \frac{1}{k + 1} \sum_{i = 0} ^{k - 1} C_{k + 1} ^{i} B_i + B_k\\ 则有B_k - S_k(1) = - \frac{1}{k + 1} \sum_{i = 0} ^{k - 1} C_{k + 1} ^{i} B_i\\ 特殊地,考虑k = 0,有S_0(1) = 1, 所以B_0 = 1\\ k \geq 1, S_k(1) = 0, 所以B_k = - \frac{1}{k + 1} \sum_{i = 0} ^{k - 1} C_{k + 1} ^{i} B_i\\ n=1Sk(1)=k+11i=0kCk+1iBiSk(1)=k+11i=0k1Ck+1iBi+BkBkSk(1)=k+11i=0k1Ck+1iBik=0,S0(1)=1,B0=1k1,Sk(1)=0,Bk=k+11i=0k1Ck+1iBi
由此我们可以O(k2)O(k ^ 2)O(k2)递推出伯努利数出来了。

FaulhaberFaulhaberFaulhaber公式

Sk(x)=1k+1∑i=0kCk+1iBixk−i+1S_k(x) = \frac{1}{k + 1} \sum\limits_{i = 0} ^{k}C_{k + 1} ^{i}B_i x ^{k - i + 1}Sk(x)=k+11i=0kCk+1iBixki+1

一个自然数幂次求和的公式,其实就是我们推导过程中的一步。

#include <bits/stdc++.h>using namespace std;const int N = 3e3 +10, mod = 1e9 + 7;int C[N][N], B[N], inv[N];void init() {for (int i = 0; i < N; i++) {C[i][0] = C[i][i] = 1;for (int j = 1; j < i; j++) {C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;}}inv[1] = 1;for (int i = 2; i < N; i++) {inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;}B[0] = 1;for (int i = 1; i < N - 1; i++) {int cur = 0;for (int j = 0; j < i; j++) {cur = (cur + 1ll * C[i + 1][j] * B[j] % mod) % mod;}cur = 1ll * cur * inv[i + 1] % mod;B[i] = (mod - cur) % mod;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();int T, k;scanf("%d", &T);while (T--) {long long n, ans = 0, cur = 1;scanf("%lld %d", &n, &k);n++;n %= mod;for (int i = k; i >= 0; i--) {cur = cur * n % mod;ans = (ans + 1ll * C[k + 1][i] * B[i] % mod * cur % mod) % mod;}printf("%lld\n", ans * inv[k + 1] % mod);}return 0;
}

考虑生成函数

∑i=0nCn+1iBi=[n=0]对两边加上Bn+1∑i=0n+1Cn+1iBi=[n=0]+Bn+1∑i=0nCniBi=[n=1]+Bn∑i=0n1i!(n−i)!Bi=[n=1]+Bnn!设指数型生成函数B(x)=∑n≥0Bnxn有B(x)ex=x+B(x)从而有B(x)=xex−1B(x)=x∑n≥01n!xn−1x∑n≥11n!xn1∑n≥01(n+1)!xn\sum_{i = 0} ^{n} C_{n + 1} ^{i} B_i = [n = 0]\\ 对两边加上B_{n + 1}\\ \sum_{i = 0} ^{n + 1} C_{n + 1} ^{i} B_i = [n = 0] + B_{n + 1}\\ \sum_{i = 0} ^{n} C_{n} ^{i} B_i = [n = 1] + B_{n}\\ \sum_{i = 0} ^{n} \frac{1}{i!(n - i)!} B_{i} = [n = 1] + \frac{B_{n}}{n!}\\ 设指数型生成函数B(x) = \sum_{n \geq 0} B_n x ^ n\\ 有B(x) e ^x = x + B(x)\\ 从而有B(x) = \frac{x}{e ^ x - 1}\\ B(x) = \frac{x}{\sum\limits_{n \geq 0} \frac{1}{n!} x ^ n - 1}\\ \frac{x}{\sum\limits_{n \geq 1} \frac{1}{n!} x ^ n}\\ \frac{1}{\sum\limits_{n \geq 0} \frac{1}{(n + 1)!}x ^ n}\\ i=0nCn+1iBi=[n=0]Bn+1i=0n+1Cn+1iBi=[n=0]+Bn+1i=0nCniBi=[n=1]+Bni=0ni!(ni)!1Bi=[n=1]+n!BnB(x)=n0BnxnB(x)ex=x+B(x)B(x)=ex1xB(x)=n0n!1xn1xn1n!1xnxn0(n+1)!1xn1
只需多项式求逆即可解决。

#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10, mod = 998244353;int r[N], b[N], t[N];int quick_pow(int a, int n) {int ans = 1;while (n) {if (n & 1) {ans = 1ll * a * ans % mod;}a = 1ll * a * a % mod;n >>= 1;}return ans;
}void get_r(int lim) {for (int i = 0; i < lim; i++) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}void NTT(int *f, int lim, int rev) {for (int i = 0; i < lim; i++) {if (i < r[i]) {swap(f[i], f[r[i]]);}}for (int mid = 1; mid < lim; mid <<= 1) {int wn = quick_pow(3, (mod - 1) / (mid << 1));for (int len = mid << 1, cur = 0; cur < lim; cur += len) {int w = 1;for (int k = 0; k < mid; k++, w = 1ll * w * wn % mod) {int x = f[cur + k], y = 1ll * w * f[cur + mid + k] % mod;f[cur + k] = (x + y) % mod, f[cur + mid + k] = (x - y + mod) % mod;}}}if (rev == -1) {int inv = quick_pow(lim, mod - 2);reverse(f + 1, f + lim);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * inv % mod;}}
}void polyinv(int *f, int *g, int n) {if (n == 1) {g[0] = quick_pow(f[0], mod - 2);return ;}polyinv(f, g, n + 1 >> 1);for (int i = 0; i < n; i++) {t[i] = f[i];}int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);NTT(t, lim, 1);NTT(g, lim, 1);for (int i = 0; i < lim; i++) {int cur = (2 - 1ll * g[i] * t[i] % mod + mod) % mod;g[i] = 1ll * g[i] * cur % mod;t[i] = 0;}NTT(g, lim, -1);for (int i = n; i < lim; i++) {g[i] = 0;}
}int fac[N], ifac[N], B[N], n;void init() {fac[0] = 1;for (int i = 1; i < N; i++) {fac[i] = 1ll * fac[i - 1] * i % mod;}ifac[N - 1] = quick_pow(fac[N - 1], mod - 2);for (int i = N - 2; i >= 0; i--) {ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();n = 100000;for (int i = 0; i <= n + 1; i++) {B[i] = ifac[i + 1];}polyinv(B, b, n + 2);for (int i = 0; i <= n + 1; i++) {B[i] = 1ll * b[i] * fac[i] % mod;}for (int i = 0; i <= n + 1; i++) {printf("%d%c", B[i], i == n + 1 ? '\n' : ' ');}return 0;
}

P3711 仓鼠的数学题

F(x)=∑k=0nSk(x)ak原本定义的Sk(x)=∑i=0xik根据伯努利数的定义Sk′(x)=∑i=0x−1ik则我们求F(x)=∑k=0nSk′(x)ak,答案即为F(x+1)考虑先求F(x)=∑k=0nak1k+1∑i=0kCk+1iBixk−i+1∑k=0nakk+1∑i=0k(k+1)!i!(k+1−i)!Bixk−i+1∑k=0nakk!∑i=0kBii!xk−i+1(k−i+1)!∑i=1n+1xii!∑k=i−1n(akk!)(Bk+1−i(k+1−i)!)设f(n)=akk!,g(n)=Bnn!,另g(n)=g(n−i)即翻转一下∑i=1n+1xii!∑k=i−1nf(k)g(n+i−k)容易发现后面是一个卷积,所以可以优化F(x) = \sum_{k = 0} ^{n} S_k(x) a_k\\ 原本定义的S_k(x) = \sum_{i = 0} ^{x} i ^ k\\ 根据伯努利数的定义S'_k(x) = \sum_{i = 0} ^{x - 1} i ^ k\\ 则我们求F(x) = \sum_{k = 0} ^{n} S'_k(x) a_k, 答案即为F(x + 1)\\ 考虑先求F(x) = \sum_{k = 0} ^{n} a_k \frac{1}{k + 1} \sum\limits_{i = 0} ^{k}C_{k + 1} ^{i}B_i x ^{k - i + 1}\\ \sum_{k = 0} ^{n} \frac{a_k}{k + 1} \sum_{i = 0} ^{k} \frac{(k + 1)!}{i!(k + 1 - i)!} B_i x ^{k - i + 1}\\ \sum_{k = 0} ^{n} a_k k! \sum_{i = 0} ^{k} \frac{B_i}{i!}\frac{x ^{k - i + 1}}{(k - i + 1)!}\\ \sum_{i = 1} ^{n + 1} \frac{x ^{i}}{i!} \sum_{k = i - 1} ^{n} \left(a_k k!\right) \left( \frac{B_{k + 1 - i}}{(k + 1 - i)!} \right)\\ 设f(n) = a_k k!, g(n) = \frac{B_{n}}{n!}, 另g(n) = g(n - i)即翻转一下\\ \sum_{i = 1} ^{n + 1} \frac{x ^ i}{i!} \sum_{k = i - 1} ^{n} f(k) g(n + i - k)\\ 容易发现后面是一个卷积,所以可以优化\\ F(x)=k=0nSk(x)akSk(x)=i=0xikSk(x)=i=0x1ikF(x)=k=0nSk(x)ak,F(x+1)F(x)=k=0nakk+11i=0kCk+1iBixki+1k=0nk+1aki=0ki!(k+1i)!(k+1)!Bixki+1k=0nakk!i=0ki!Bi(ki+1)!xki+1i=1n+1i!xik=i1n(akk!)((k+1i)!Bk+1i)f(n)=akk!,g(n)=n!Bn,g(n)=g(ni)i=1n+1i!xik=i1nf(k)g(n+ik)
下面的n=n+1n = n + 1n=n+1,由上易知F(x)F(x)F(x)是一个n+1n + 1n+1次多项式。
设F(x)=∑i=0naixiF(x+1)=∑i=0nai(x+1)i∑i=0nai∑j=0iCjixj∑i=0nai∑j=0ii!j!(i−j)!xj∑i=0nxii!∑j=inajj!1(j−i)!另f(n)=ann!,g(n)=1n!,再翻转g(n)∑i=0nxii!∑j=inf(j)g(n+i−j)后面也同样是一个卷积,所以可以优化设F(x) = \sum_{i = 0} ^{n} a_i x ^ i\\ F(x + 1) = \sum_{i = 0} ^{n} a_i (x + 1) ^ i\\ \sum_{i = 0} ^{n} a_i \sum_{j = 0} ^{i} C_{j} ^{i} x ^ j\\ \sum_{i = 0} ^{n} a_i \sum_{j = 0} ^{i} \frac{i!}{j!(i - j)!} x ^ j\\ \sum_{i = 0} ^{n} \frac{x ^ i}{i!} \sum_{j = i} ^{n} a_j j! \frac{1}{(j - i)!}\\ 另f(n) = a_n n!, g(n) = \frac{1}{n!},再翻转g(n)\\ \sum_{i = 0} ^{n} \frac{x ^{i}}{i!} \sum_{j = i} ^{n} f(j) g(n + i - j)\\ 后面也同样是一个卷积,所以可以优化\\ F(x)=i=0naixiF(x+1)=i=0nai(x+1)ii=0naij=0iCjixji=0naij=0ij!(ij)!i!xji=0ni!xij=inajj!(ji)!1f(n)=ann!,g(n)=n!1,g(n)i=0ni!xij=inf(j)g(n+ij)

#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10, mod = 998244353;int r[N], t[N];int quick_pow(int a, int n) {int ans = 1;while (n) {if (n & 1) {ans = 1ll * a * ans % mod;}a = 1ll * a * a % mod;n >>= 1;}return ans;
}void get_r(int lim) {for (int i = 0; i < lim; i++) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}void NTT(int *f, int lim, int rev) {for (int i = 0; i < lim; i++) {if (i < r[i]) {swap(f[i], f[r[i]]);}}for (int mid = 1; mid < lim; mid <<= 1) {int wn = quick_pow(3, (mod - 1) / (mid << 1));for (int len = mid << 1, cur = 0; cur < lim; cur += len) {int w = 1;for (int k = 0; k < mid; k++, w = 1ll * w * wn % mod) {int x = f[cur + k], y = 1ll * w * f[cur + mid + k] % mod;f[cur + k] = (x + y) % mod, f[cur + mid + k] = (x - y + mod) % mod;}}}if (rev == -1) {int inv = quick_pow(lim, mod - 2);reverse(f + 1, f + lim);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * inv % mod;}}
}void polyinv(int *f, int *g, int n) {if (n == 1) {g[0] = quick_pow(f[0], mod - 2);return ;}polyinv(f, g, n + 1 >> 1);for (int i = 0; i < n; i++) {t[i] = f[i];}int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);NTT(t, lim, 1);NTT(g, lim, 1);for (int i = 0; i < lim; i++) {int cur = (2 - 1ll * g[i] * t[i] % mod + mod) % mod;g[i] = 1ll * g[i] * cur % mod;t[i] = 0;}NTT(g, lim, -1);for (int i = n; i < lim; i++) {g[i] = 0;}
}int fac[N], ifac[N], a[N], f[N], g[N], B[N], n;void init() {fac[0] = 1;for (int i = 1; i < N; i++) {fac[i] = 1ll * fac[i - 1] * i % mod;}ifac[N - 1] = quick_pow(fac[N - 1], mod - 2);for (int i = N - 2; i >= 0; i--) {ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();scanf("%d", &n);for (int i = 0; i <= n; i++) {scanf("%d", &a[i]);}for (int i = 0; i <= n + 1; i++) {B[i] = ifac[i + 1];}polyinv(B, g, n + 2);for (int i = 0; i <= n; i++) {f[i] = 1ll * a[i] * fac[i] % mod;}reverse(g, g + n + 2);int lim = 1;while (lim < 2 * n + 10) {lim <<= 1;}get_r(lim);NTT(f, lim, 1), NTT(g, lim, 1);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * g[i] % mod;}NTT(f, lim, -1);for (int i = 1; i <= n + 1; i++) {a[i] = 1ll * ifac[i] * f[n + i] % mod;}a[0] = 0;n++;for (int i = 0; i < lim; i++) {f[i] = g[i] = 0;}for (int i = 0; i <= n; i++) {f[i] = 1ll * a[i] * fac[i] % mod;g[i] = ifac[n - i];}NTT(f, lim, 1), NTT(g, lim, 1);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * g[i] % mod;}NTT(f, lim, -1);for (int i = 0; i <= n; i++) {printf("%lld%c", 1ll * ifac[i] * f[n + i] % mod, i == n ? '\n' : ' ');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发和并行及多线程基本概念

并发&#xff08;Concurrent&#xff09; 在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机上运行&#xff0c;但任一个时刻点上只有一个程序在处理机上运行。 并发&#xff0c;本质上是一个物理…

XUnit 依赖注入

XUnit 依赖注入Intro现在的开发中越来越看重依赖注入的思想&#xff0c;微软的 Asp.Net Core 框架更是天然集成了依赖注入&#xff0c;那么在单元测试中如何使用依赖注入呢&#xff1f;本文主要介绍如何通过 XUnit 来实现依赖注入&#xff0c; XUnit 主要借助 SharedContext 来…

P3711 仓鼠的数学题(伯努利数)

P3711 仓鼠的数学题 有关伯努利数的知识可以看我的上一篇题解链接&#xff08;写的超详细&#xff09;。 F(x)∑k0nSk(x)ak原本定义的Sk(x)∑i0xik根据伯努利数的定义Sk′(x)∑i0x−1ik则我们求F(x)∑k0nSk′(x)ak,答案即为F(x1)考虑先求F(x)∑k0nak1k1∑i0kCk1iBixk−i1∑k0n…

程序员自家种水果,新鲜包邮配送!

点击上面“蓝字”关注我们&#xff01;上次猕猴桃的活动一经推出&#xff0c;得到了广大粉丝的支持&#xff0c;我感到十分欣慰&#xff0c;非常感谢大家对我的信任。好多小伙伴&#xff0c;买了一箱尝过后又下单了好几箱。事实证明&#xff0c;品质才是销量的最佳保证。有些粉…

实现一个简单的基于码云(Gitee) 的 Storage

实现一个简单的基于码云(Gitee) 的 StorageIntro上次在 asp.net core 从单机到集群 一文中提到存储还不支持分布式&#xff0c;并立了一个 flag基于 github 或者 开源中国的码云实现一个 storage于是这两天就来填坑了。。实现了一个简单的基于开源中国的码云的 storage准备工作…

Java多线程的4种实现方式

** Java多线程的4种实现方式 ** 1&#xff1a;继承Thread并重写run方法&#xff0c;并调用start方法 /*** Java实现多线程的方式1* 继承Thread类&#xff0c;重写run方法* author hongbo.zhao 2019年4月12日 上午7:12:35*/ class MyThread extends Thread {Overridepublic …

采蘑菇的克拉莉丝(树链剖分)

采蘑菇的克拉莉丝 一个有点意思的树链剖分的题。 题意&#xff1a; 一棵树&#xff0c;有两种操作&#xff1a; ①&#xff1a;在点vvv放xxx个蘑菇。 ②&#xff1a;将起点变为vvv。 每次计算收集所有蘑菇的代价。 收集蘑菇的代价为&#xff0c;起点到所在蘑菇的路径上的…

HDU 6428 Problem C. Calculate(积性函数)

Problem C. Calculate ϕϕ∗ϵϕ∗μ∗Iϕ(n)∑d∣n(ϕ∗μ)(d)设g(n)∑d∣n(ϕ∗μ)(d)∑i1A∑j1B∑k1Cϕ(gcd(i,j2,k3))∑i1A∑j1B∑k1C∑d∣i,d∣j2,d∣k3(ϕ∗μ)(d)∑d1A(ϕ∗μ)(d)∑i1A∑j1B∑k1C[d∣i,d∣j2,d∣k3]\phi \phi * \epsilon \phi * \mu * I\\ \phi(n) …

Java线程的6种状态

线程的概念&#xff0c;以及线程的创建方式&#xff0c;见我之前写的博文 本篇文章主要讲Java线程的6种状态 6种状态&#xff1a;初始状态&#xff08;new&#xff09; 、可运行状态&#xff08;Runnable&#xff09;、运行状态&#xff08;Running&#xff09;、阻塞状态&am…

C. Goodbye Souvenir(CDQ 或 树套树)

C. Goodbye Souvenir ∑iLRi−preAi[preAi≥L]\sum\limits_{i L} ^{R} i - pre_{A_i} [pre_{A_i} \geq L]iL∑R​i−preAi​​[preAi​​≥L]&#xff0c;进一步考虑即∑i−preAi[i≤R,preAi≥L]\sum i - pre_{A_i}[i \leq R, pre_{A_i} \geq L]∑i−preAi​​[i≤R,preAi​​…

.NET Core 微信小程序支付——(统一下单)

最近公司研发了几个电商小程序&#xff0c;还有一个核心的电商直播&#xff0c;只要是电商一般都会涉及到交易信息&#xff0c;离不开支付系统&#xff0c;这里我们统一实现小程序的支付流程&#xff08;与服务号实现步骤一样&#xff09;。目录1、开通小程序的支付能力2、商户…

P4768 [NOI2018] 归程(kruskal 重构树)

P4768 [NOI2018] 归程 给定一个nnn个点&#xff0c;mmm条边的无向联通图&#xff0c;边的描述为[u,v,l,a][u, v, l, a][u,v,l,a]&#xff0c;表示uuu&#xff0c;vvv连有一条长度为lll&#xff0c;海拔为aaa的边&#xff0c; 有QQQ个询问&#xff0c;每次给出一个出发点uuu和…

用.NET写“算命”程序

前言“算命”&#xff0c;是一种迷信&#xff0c;我父亲那一辈却执迷不悟&#xff0c;有时深陷其中&#xff0c;有时为求一“上上签”&#xff0c;甚至不惜重金&#xff0c;向“天神”保佑。我曾看到过有些算命网站&#xff0c;可以根据人的生辰八字&#xff0c;来求得这个人一…

Java线程调度

线程调度指的是系统为线程分配CPU使用权的方式。主要有协同式线程调度和抢占式线程调度。 协同式线程调度&#xff08;Cooperative Threads-Scheduling&#xff09; 在多线程系统中&#xff0c;线程的执行时间由线程自身控制&#xff0c;执行结束后要主动通知系统切换到另一线…

#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)

#3551. [ONTAK2010]Peaks加强版 我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。 考虑按照边权升序&#xff0c;建议kruskalkruskalkruskal重构树&#xff0c;然后倍增向上跳&#xff0c;找到困难值小于等于xxx的深度最小的节点uuu&#…

ASP.NET Core 3.0 迁移避坑指南

一.前言.NET Core 3.0将会在 .NET Conf 大会上正式发布&#xff0c;截止今日发布了9个预览版&#xff0c;改动也是不少&#xff0c;由于没有持续关注&#xff0c;今天将前面开源的动态WebApi项目迁移到.NET Core 3.0还花了不少时间踩坑&#xff0c;给大家分享一下我在迁移过程中…

kruskal 重构树(讲解 + 例题)

kruskal重构树 如何建树 模仿kruskalkruskalkruskal&#xff0c;先将所有边排序。 依次遍历每一条边&#xff0c;如果这条边的两个节点&#xff08;u,vu, vu,v&#xff09;不在同一个连通块里面&#xff0c; 则新建一个nodenodenode节点&#xff0c;更新fa[u]fa[v]nodefa[u…

打不死我的,终将使我强大!DevOps黑客马拉松参赛心得

&#xff08;IDCF DevOps黑客马拉松到底是个啥活动&#xff1f;&#xff09;长得丑活得久、长得帅也惹人爱&#xff01;大家好&#xff0c;我是刘威。隆正信息的业务架构师-花名逸云。非常荣幸可以参加在北京举办的第一届DevOps黑客马拉松比赛。黑客马拉松不是突然冒出来的&…

Java线程池面试题

1、什么是线程池 java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服…

F. Cheap Robot(kruskal 重构树)

F. Cheap Robot 给定一个无向连通图&#xff0c;每条边有边权&#xff0c;路过需要消耗对应的电量&#xff08;边权&#xff09;&#xff0c;有kkk个中心点&#xff0c; 问从a−>ba-> ba−>b&#xff0c;我们最少需要带多少电&#xff0c;设最小为CCC&#xff0c;当…