「闲话随笔」把朋友交给权力

发布时间 2023-07-23 21:27:01作者: K8He

「闲话随笔」把朋友交给权力

点击查看目录

解释标题:今天第一个题的题目名称提出来「Pass」和「to」,第二个题的题目名称提出来「friends」,第三个题的题目名称提出来「powers」,组合出「Pass friends to powers」,翻译成中文「把朋友交给权力」。


啊?

image

image


好像有消息说五维有新官方要复活了?我没有官群我不知道是不是真的,感觉挺好,放李迪克手里吃枣药丸。但是星尘的高质量原创曲好像还是不多,反正我没怎么刷到。

image

原来不止我啊。

茶理理今年好高产,那是不是可以把她想象成星尘。

今日推歌:うっせぇわ

正しさとは 愚かさとは
それが何か見せつけてやる
ちっちゃな頃から優等生
気づいたら大人になっていた
ナイフの様な思考回路
持ち合わせる訳もなく
でも遊び足りない 何か足りない
困っちまうこれは誰かのせい
あてもなくただ混乱するエイデイ
それもそっか
最新の流行は当然の把握
経済の動向も通勤時チェック
純情な精神で入社しワーク
社会人じゃ当然のルールです
はぁ?うっせぇうっせぇうっせぇわ
あなたが思うより健康です
一切合切凡庸な
あなたじゃ分からないかもね
嗚呼よく似合う
その可もなく不可もないメロディー
うっせぇうっせぇうっせぇわ
頭の出来が違うので問題はナシ
つっても私模範人間
殴ったりするのはノーセンキュー
だったら言葉の銃口を
その頭に突きつけて撃てば
マジヤバない?止まれやしない
不平不満垂れて成れの果て
サディスティックに変貌する精神
クソだりぃな
酒が空いたグラスあれば直ぐに注ぎなさい
皆がつまみ易いように串外しなさい
会計や注文は先陣を切る
不文律最低限のマナーです
はぁ?うっせぇうっせぇうっせぇわ
くせぇ口塞げや限界です
絶対絶対現代の代弁者は私やろがい
もう見飽きたわ
二番煎じ言い換えのパロディ
うっせぇうっせぇうっせぇわ
丸々と肉付いたその顔面にバツ
うっせぇうっせぇうっせぇわ
うっせぇうっせぇうっせぇわ
私が俗に言う天才です
うっせぇうっせぇうっせぇわ
あなたが思うより健康です
一切合切凡庸な
あなたじゃ分からないかもね
嗚呼つまらねぇ
何回聞かせるんだそのメモリー
うっせぇうっせぇうっせぇわ
アタシも大概だけど
どうだっていいぜ問題はナシ

但是这歌原唱不是茶理理,只是她今年翻唱过。

很惊人啊!我没记错的话她去年一整年只投了两个稿但今年已经投了五六个了!而且她今年还学会催更别人了!


对于「我喜欢听什么样的歌」这个问题已经思考很久了。

得到的答案是:我也不知道。


STAOI T4 出来了,准备给骚老师一个惊喜,预告:

image

NOI 前复习大量模板 Orz

image


一直感觉我认识的 HZOI 2022 人挺多的,但是今天我才发现我混的还算熟的有 APJ,Soy,RS,xuany,Really,没了。

对得上人脸的也不多有 yswn(其实很久了但一点不熟啊),Sonnety,shoto,6_curly_L,白简,iCostanna,没了。

还有一位老哥高考假的时候一个宿舍,也比较熟了,但是一直不知道他真名和网名 ?

但是感觉全认识我,都知道我是 K8He,怎么回事呢?

昨天中午被卖,但直到晚上我才发现因为肤色大家其实在进行三角贸易。

昨天晚上和 Rolling_Star 聊了一些东西。

谈到他鲜花。他说他研究的组合恒等式啥的很没有,我不会我不做评价但是感觉就算没用会这种也是很厉害的事吧,感觉很假。

把咱俩对高等数学的了解程度转成布尔值,你就是 1 我就是 0,你照样无穷倍杀我。

谈到我做 AGC。我很赞同 Kaguya 的瑞平「u1s1 这么早就开始写 AGC 有点浪费」,不管是从时间上说还是对思维提升上来说。现阶段做 AGC 其实很难想到什么正确思路方向,基本都是在贺题解,还不如边刷知识点边打打校内模拟赛。体会到了其他过来人说的那种「感觉学了好多东西但仔细看看啥也没学,实力好像没有任何提升」的空虚感,不知道以后的感受会不会更强烈。现在回头看感觉现阶段就做一些比较超出我水平的题确实是在走弯路,但是至少知道了以后再做这些题比较合适,还年轻,别回不过头就行。

但是好像也不像以前那么年轻了,一年后就要在两年半的努力下把所有 HZOI 2022 人彻底送走了,然后再来两年就要把我自己彻底送走了。

氛围好好,真的不想离开。

[ARC124E] Pass to Next

不难发现每个人传球个数都不为零时,可以全部少传 \(1\) 个球,显然没有影响。那就仅考虑存在人不传球的情况,易发现只考虑这样就已经做到不重不漏了。

但好像还是比较难算,考虑容斥,\(x_i\in [0, a_i]\) 贡献减去 \(x_i\in [1, a_i]\) 贡献。

考虑计算答案,这里先只看 \(x_i\in [0, a_i]\) 的式子:

\[f_n = \prod_{i = 1}^{n}(a_i - x_i + x_{i - 1}) \]

暴拆:

\[f_n = a_n\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1}) - x_n\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1}) + x_{n - 1}\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1}) \]

前头这俩玩意可以递推,但后边这玩意有个 \(x_{n - 1}\) 比较困难,单独算。

\(g_n = x_{n}\prod_{i = 1}^{n}(a_i - x_i + x_{i - 1})\) 可推出 \(f\)

\[f_n = (a_n - x_n)f_{n - 1} + g_{n - 1} \]

考虑递推求 \(g\)

\[\begin{aligned} g_n &= a_{n}x_{n}\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1}) - x_n^2\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1}) + x_{n}x_{n - 1}\prod_{i = 1}^{n - 1}(a_i - x_i + x_{i - 1})\\ g_n &= (x_{n}a_{n} - x_{n}^2)f_{n - 1} + x_ng_{n - 1} \end{aligned} \]

\(S_1(x) = \frac{x(x + 1)}{2}\)\(S_2(x) = \frac{x(x + 1)(2x + 1)}{6}\),递推式:

\[\begin{aligned} f_n &= S_1(a_n)f_{n - 1} + (a_n + 1)g_{n - 1}\\ g_n &= (S_1(a_n)a_{n} - S_2(a_n))f_{n - 1} + S_1(a_n)g_{n - 1} \end{aligned} \]

感觉这个 \(f\) 长得很奇怪啊,和更上面的式子完全不一样。原因是我们要算出 \(x\) 的所有取值的贡献,\(x\) 此时有 \(a_i + 1\) 种取值,所以 \(a_nf_{n - 1}\)\(g_{n - 1}\) 会做出 \(a_i + 1\) 贡献,也就是:

\[\begin{aligned} f_n &= ((a_n + 1)a_n - \frac{(a_n + 1)a_n}{2})f_{n - 1} + (a_n + 1)g_{n - 1}\\ &= S_1(a_n)f_{n - 1} + (a_n + 1)g_{n - 1}\\ \end{aligned} \]

点击查看代码
const ll N = 1e5 + 10, P = 998244353, inv2 = 499122177, inv6 = 166374059;
namespace SOLVE {
	ll n, a[N], f[N][2], ans;
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline ll S (ll x, bool type) {
		if (!type) return x * (x + 1) % P * inv2 % P;
		else return x * (x + 1) % P * (x * 2 + 1) % P * inv6 % P;
	}
	inline ll Calc (bool t1, bool t2) {
		memset (f, 0, sizeof (f));
		f[1][t1] = 1;
		_for (i, 2, n + 1) {
			f[i][0] = (S (a[i] - t2, 0) * f[i - 1][0] % P + (a[i] + 1 - t2) * f[i - 1][1] % P ) % P;
			f[i][1] = ((S (a[i], 0) * a[i] % P - S (a[i], 1) + P) * f[i - 1][0] % P + S (a[i], 0) * f[i - 1][1] % P) % P;
		}
		return f[n + 1][t1];
	}
	inline void In () {
		n = rnt ();
		_for (i, 1, n) a[i] = rnt ();
		return;
	}
	inline void Solve () {
		a[n + 1] = a[1];
		ans = ((Calc (1, 0) + Calc (0, 0)) % P - (Calc (1, 1) + Calc (0, 1)) % P + P) % P;
		return;
	}
	inline void Out () {
		printf ("%lld\n", ans);
		return;
	}
}

P9409 『STA - R2』交朋友

网络流基础练习题,办的时候还不会,现在看看还真挺典。

每个时刻只能有一个玩具,考虑拆点为出入点,连边容量为 \(1\)

不同时刻不同图,那么考虑建分层图,若 \(t\) 时刻 \(u,v\) 坐一起则将 \(t - 1\) 时刻的 \(u\) 连向 \(t\) 时刻的 \(v\)\(t - 1\) 时刻的 \(v\) 连向 \(t\) 时刻的 \(u\)

与源点,汇点相连的边容量为 \(1\)

注意初始时刻为 \(0\)

点击查看代码

求最大流部分省了。

namespace SOLVE {
	ll t, n, m[15], u[15][N], v[15][N], tot, p[15][N][2];
	GRAPH::Graph g;
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline void In () {
		t = rnt (), n = rnt ();
		_for (i, 1, t) {
			m[i] = rnt ();
			_for (j, 1, m[i]) u[i][j] = rnt (), v[i][j] = rnt ();
		}
		return;
	}
	inline void Solve () {
		tot = 2;
		_for (i, 0, t) _for (j, 1, n) p[i][j][0] = ++tot, p[i][j][1] = ++tot;
		_for (i, 1, n) {
			g.AddEdge (1, p[0][i][0], 1);
			g.AddEdge (p[t][i][1], 2, 1);
			g.AddEdge (p[0][i][0], p[0][i][1], 1);
		}
		_for (i, 1, t) {
			_for (j, 1, n) g.AddEdge (p[i][j][0], p[i][j][1], 1);
			_for (j, 1, m[i]) {
				g.AddEdge (p[i - 1][u[i][j]][1], p[i][v[i][j]][0], 1);
				g.AddEdge (p[i - 1][v[i][j]][1], p[i][u[i][j]][0], 1);
			}
		}
		g.Init (tot, 1, 2);
		g.Dinic ();
		return;
	}
	inline void Out () {
		printf ("%lld\n", g.maxflow);
		return;
	}
}

[ARC106D] Powers

考虑容斥。

\[\begin{aligned} \sum_{l = 1}^{n - 1}\sum_{r = l + 1}^{n}(a_l + a_r)^x &=\frac{\sum_{l = 1}^{n}\sum_{r = 1}^{n}(a_l + a_r)^x - \sum_{l = 1}^{n}(2a_i)^x}{2}\\ \end{aligned} \]

后边预处理出来,考虑使用二项式定理化简一下前边的。

\[\begin{aligned} \sum_{l = 1}^{n}\sum_{r = 1}^{n}(a_l + a_r)^x &=\sum_{l = 1}^{n}\sum_{r = 1}^{n}\sum_{k = 0}^{x}\dbinom{x}{k}a_l^{k}a_r^{x - k}\\ &=\sum_{k = 0}^{x}\dbinom{x}{k}(\sum_{l = 1}^{n}a_l^{k})(\sum_{r = 1}^{n}a_r^{x - k})\\ \end{aligned} \]

那么对于所有的 \(x\) 预处理出来 \(\sum_{i = 1}^{n}a_i^x\) 即可。

时间复杂度 \(O(nk)\)

点击查看代码
const ll N = 2e5 + 10, K = 310, P = 998244353;
namespace SOLVE {
	ll n, k, a[N], b[2][K], c[K][K], ans[K];
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline ll FastPow (ll a, ll b) {
		ll ans = 1;
		while (b) {
			if (b & 1) ans = ans * a % P;
			a = a * a % P, b >>= 1;
		}
		return ans;
	}
	inline void In () {
		n = rnt (), k = rnt ();
		_for (i, 1, n) a[i] = rnt ();
		return;
	}
	inline void Solve () {
		c[0][0] = 1, b[0][0] = b[1][0] = n;
		_for (j, 1, k) {
			_for (i, 1, n) {
				b[0][j] = (b[0][j] + FastPow (a[i], j)) % P;
				b[1][j] = (b[1][j] + FastPow (a[i] << 1, j)) % P;
			}
		}
		_for (i, 1, k) {
			c[i][0] = 1, ans[i] = b[0][0] * b[0][i] % P;
			_for (j, 1, i) {
				c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % P;
				ans[i] = (ans[i] + c[i][j] * b[0][j] % P * b[0][i - j] % P) % P;
			}
			ans[i] = (ans[i] - b[1][i] + P) % P * 499122177 % P;
		}
		return;
	}
	inline void Out () {
		_for (i, 1, k) printf ("%lld\n", ans[i]);
		return;
	}
}