首页 > 其他分享 >[CF2039G] Shohag Loves Pebae 做题记录

[CF2039G] Shohag Loves Pebae 做题记录

时间:2025-01-08 20:44:35浏览次数:1  
标签:Pebae const ll maxn void Loves 质数 Shohag define

link

高级筛法题。

每条路径的条件是很难求的,考虑将其转化。

发现对于一条路径,点数为 \(c = a\cdot b\),那么其条件是无用的:考虑其包含的所有点数为 \(a\) 的路径,需要满足这 \(c\) 个点的权值乘积不被 \(a\) 整除。

进一步的,只有点数为质数的路径条件才有用。对于每个点 \(i\),求出 \(a_i\) 表示最长的包含点 \(i\) 的路径点数是多少,那么点 \(i\) 分配的权值不能包含 \(\le a_i\) 的质数。

筛出质数,求出 \(c_i\) 表示 \(\le a_i\) 的质数个数,那么点 \(i\) 的权值不能包含前 \(c_i\) 个质数。

不难发现这和 min25 筛前半部分要求的东西很像,设 \(f_{i, j}\) 表示 \([1, j]\) 中除去最小质因子是前 \(i\) 个质数的合数后,剩下的数的个数,那么点 \(i\) 可以分配的权值个数为 \(f_{c_i, m}\)。

加上所有点 \(\gcd\) 为 \(1\) 的条件,考虑莫比乌斯反演。令 \(t \gets \max\limits_i c_i\),\(p_i\) 为第 \(i\) 个质数,答案即为:

\[\sum\limits_{d = 1} ^ m [mnp(d) > p_t] \mu(d) \prod_i f_{c_i, \lfloor \frac md \rfloor} \]

枚举 \(d\) 可以整除分块,这样我们需要求:

  • \([1, r]\) 中除去最小质因子是前若干个质数的数后,剩下数的莫比乌斯函数之和。

  • 固定 \(t\),求 \(\prod_i f_{c_i, t}\)。

前者可以先杜教筛求一个莫比乌斯函数前缀和,再类似于 min25 前半部分的 DP 求出。

后者考虑统计 \(cnt_j\) 表示 \(\sum\limits_i [c_i = j]\)。设 \(k = \lfloor \sqrt m \rfloor\),则我们只需要用 \(\le k\) 的质数去筛,但是可能 \(p_{c_i} > k\),所以需要特殊处理。

但是这样复杂度会出现问题:\(f\) 的第二维大小为 \(\mathcal O(\sqrt m)\),而 \(c_i\) 可达 \(\mathcal O(\dfrac n {\log n})\),加上快速幂,时间复杂度为 \(\mathcal O(\dfrac {n \sqrt m \log (\frac n {\sqrt m})} {\log n})\)。

瓶颈在于 \(c_i\) 的大小。此时又注意到一个性质:\(\max\limits_i a_i \le 2\min\limits_i a_i\),因为每个点可以到直径的任意一端。

所以我们可以分讨处理:

  • 当 \(\max\limits_i a_i \ge 2k\),此时每个点的权值一定是一个质数,用单步容斥代替莫比乌斯反演。

  • 当 \(\max\limits_i a_i \ge 2k\),此时 \(c_i\) 的上界得到保证 \(\mathcal O(\dfrac {\sqrt m} {\log m})\),时间复杂度 \(\mathcal O(\dfrac {m \log (\frac n {\sqrt m})} {\log n})\)

点击查看代码
#include <bits/stdc++.h>

namespace Initial {
	#define ll long long
	#define ull unsigned long long
	#define fi first
	#define se second
	#define mkp make_pair
	#define pir pair <ll, ll>
	#define pb push_back
	#define i128 __int128
	using namespace std;
	const ll maxn = 1e6 + 10, inf = 1e13, mod = 998244353, L = 1e7 + 10;
	ll power(ll a, ll b = mod - 2, ll p = mod) {
		ll s = 1;
		while(b) {
			if(b & 1) s = 1ll * s * a %p;
			a = 1ll * a * a %p, b >>= 1;
		} return s;
	}
	template <class T>
	const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void chkmax(T &x, const T y) { x = x < y? y : x; }
	template <class T>
	const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;

namespace Read {
	char buf[1 << 22], *p1, *p2;
	// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)
	template <class T>
	const inline void rd(T &x) {
		char ch; bool neg = 0;
		while(!isdigit(ch = getchar()))
			if(ch == '-') neg = 1;
		x = ch - '0';
		while(isdigit(ch = getchar()))
			x = (x << 1) + (x << 3) + ch - '0';
		if(neg) x = -x;
	}
} using Read::rd;

ll n, m, a[maxn], c[maxn];

namespace Init {
	vector <ll> to[maxn];
	ll len, pre[maxn], suf[maxn], f[maxn], g[maxn];

	void dfs1(ll u, ll fa = 0) {
		for(ll v: to[u])
			if(v ^ fa) dfs1(v, u), chkmax(f[u], f[v] + 1);
	}
	void dfs2(ll u, ll fa = 0) {
		len = 0;
		for(ll v: to[u])
			if(v ^ fa) pre[len] = suf[++len] = f[v] + 1;
		suf[len + 1] = pre[0] = 0;
		for(ll i = 1; i <= len; i++) chkmax(pre[i], pre[i - 1]);
		for(ll i = len; i; i--) chkmax(suf[i], suf[i + 1]);
		ll c = 0;
		for(ll v: to[u])
			if(v ^ fa)
				++c, g[v] = 1 + max(g[u], max(pre[c - 1], suf[c + 1]));
		for(ll v: to[u])
			if(v ^ fa) dfs2(v, u);
	}

	void solve() {
		for(ll i = 1; i < n; i++) {
			ll u, v; rd(u), rd(v);
			to[u].pb(v), to[v].pb(u);
		} dfs1(1), dfs2(1);
		for(ll u = 1; u <= n; u++) {
			ll mx = g[u], se = 0;
			for(ll v: to[u])
				if(f[v] < f[u]) {
					if(f[v] + 1 > mx) se = mx, mx = f[v] + 1;
					else chkmax(se, f[v] + 1);
				}
			a[u] = mx + se + 1;
		}
	}
}


ll sq, pri[maxn], pr, f[maxn], len, w[maxn], mu[maxn]; bool vis[maxn];
ll id1[maxn], id2[maxn], g[maxn], k, cnt[maxn], sum[maxn];
ll h[maxn];
void xxs() {
	for(ll i = 2; i <= 1e6; i++) {
		if(!vis[i]) pri[++pr] = i, mu[i] = mod - 1;
		for(ll j = 1; j <= pr && i * pri[j] <= 1e6; j++) {
			ll k = i * pri[j]; vis[k] = true;
			if(i % pri[j]) mu[k] = mod - mu[i];
			else break;
		}
	} k = pr;
	while(pri[k] > sq) --k;
	mu[1] = 1;
	for(ll i = 1; i <= 1e6; i++) sum[i] = pls(sum[i - 1], mu[i]);
}

ll Id(ll x) {return x <= sq? id1[x] : id2[m / x];}

unordered_map <ll, ll> mp;
ll Sum(ll n) {
	if(n <= 1e6) return sum[n];
	if(mp.count(n)) return mp[n];
	ll ret = 1;
	for(ll i = 2; i <= n; i++) {
		ll d = n / i, r = n / d;
		ret = (ret - Sum(d) * (r - i + 1)) %mod;
		i = r;
	} return mp[n] = pls(ret, mod);
}

int main() {
	rd(n), rd(m); Init::solve();
	sq = sqrt(m), xxs();
	ll mx = 0;
	for(ll i = 1; i <= n; i++) {
		chkmax(mx, a[i]);
		c[i] = upper_bound(pri + 1, pri + 1 + pr, a[i]) - pri - 1;
		++cnt[c[i]];
	}
	for(ll i = 1; i <= m; i++) {
		ll d = m / i, r = m / d; w[++len] = d;
		if(d <= sq) id1[d] = len;
		else id2[m / d] = len;
		i = r, f[len] = d, h[len] = Sum(d), g[len] = 1;
	}
	for(ll i = 1; i <= pr; i++) {
		ll o = 0;
		for(ll j = 1; j <= len && pri[i] * pri[i] <= w[j]; j++)
			f[j] -= f[Id(w[j] / pri[i])] - i, o = j;
		if(pri[i] <= mx)
			for(ll j = o; j; j--)
				h[j] = (h[j] + h[Id(w[j] / pri[i])] + i - 1 + mod) %mod;
		if(mx < sq * 2 && cnt[i]) {
			for(ll j = 1; j <= len; j++)
				g[j] = g[j] * power(max(f[j] - i, 1ll), cnt[i]) %mod;
		}
	}
	if(mx >= sq * 2) {
		ll ans = 1;
		for(ll i = 1; i <= n; i++) ans = ans * max(1ll, f[1] - c[i]) %mod;
		mx = 0;
		for(ll i = 1; i <= n; i++) chkmax(mx, c[i]);
		if(mx <= f[1]) ans = (ans + mx - f[1] + 1) %mod;
		printf("%lld\n", ans); return 0;
	} ll ans = 0; mx = 0;
	for(ll i = 1; i <= n; i++) chkmax(mx, c[i]);
	for(ll i = 1; i <= len; i++) h[i] = (h[i] + min(f[i] - 1, mx)) %mod;
	for(ll i = 1; i <= m; i++) {
		ll d = m / i, r = m / d;
		ans = (ans + (h[Id(r)] - h[Id(i - 1)] + mod) * g[Id(d)]) %mod;
		i = r;
	} printf("%lld\n", ans);
	return 0;
}

标签:Pebae,const,ll,maxn,void,Loves,质数,Shohag,define
From: https://www.cnblogs.com/Sktn0089/p/18660526

相关文章

  • [BZOJ3569] DZY Loves Chinese II 题解
    考虑不联通的情况。图不好做,就造一棵生成树出来,由于是无向图,所以只有树边和返祖边。发现在一条树边断开后,生成树会分成两个连通块,由覆盖这条树边的返祖边链接,只有这些返祖边也全部断开,原图才会不联通。想到异或的优良性质。我们给所有返祖边在\([0,2^{63})\)中随机一个值作为......
  • CodeTON Round 9 D.Shohag Loves GCD
    思路(贪心+唯一分解定理)这个题其实只需要考虑一件事:记答案数组为\(a\),对于两个不同下标\(i\)和\(j\),当\(\gcd(i,j)=\min(i,j)\)时,我们只需要让\(a_{\max(i,j)}<a_{\min(i,j)}\)即可。证明:任意两个数\(x,y\),一定有\(\gcd(x,y)\leq\min(x,y)\)。第一种情况,如果......
  • web20([极客大挑战 2019]LoveSQL):
    1.对用户名和密码输入1查看回显(提示错误密码)--->将用户名修改为1'(报错,找到注入点)2.对用户名依次输入1'orderby4#1'orderby1#1'orderby3#测试出有3列测试回显位:1'unionselect1,2,3#联合查询:爆库名:geek1'unionselect1,database(),3#爆表名:......
  • CF2039E - Shohag Loves Inversions
    CF2039E-ShohagLovesInversions题面有一个整数数组\(a=[0,1]\),可以重复执行以下操作任意多次:假设\(k\)是当前数组\(a\)中的逆序对的个数。将\(k\)插入\(a\)中的任意位置,包括开头或结尾。例如,如果是\(a=[4,6,2,4]\),那么逆序对数就是\(k=3\)。因此,......
  • [BJDCTF2020]Mark loves cat
    这题进去是一个网页,最后发现没有什么东西,最后查看源码发现,在源码的最后输出了一个dog这里就断定肯定存在一些隐藏的文件,最后通过kali扫描也是发现了一些.git文件,然后就想到了git源码泄露,但是不知道为什么我的扫描不出,就只好在网上找了大佬的代码了index.php<?phpinclude'......
  • [极客大挑战 2019]LoveSQL 1
    启动靶机作者不建议使用sqlmap我们这里就进行手工注入用万能口令登录admin'or1=1#,详情见上文(https://www.cnblogs.com/m1saka1/p/18411197)登录成功获得用户名和密码,发现密码并没有卵用,只能换思路利用账号密码的回显页面进行sql注入爆破数据库由于网站自动转义,为了方......
  • 洛谷 P4829 kry loves 2048——题解
    洛谷P4829题解传送锚点摸鱼环节kryloves2048题目背景kls是一个人赢。题目描述kls最近在玩一款类似2048的游戏,规则是这样的:一开始,有\(n\)个方块,每个方块上有一个\(1\)到\(m\)的整数。kls可以进行两种操作:选择两个数字相同的方块(不一定要相邻),将它们合并成一个数字为......
  • 题解:CF1034B Little C Loves 3 II
    思路看到这道题时,第一思路就是网络流,结果一看数据\(10^{9}\)直接转向找规律。主要思路:神秘特判。首先,下面的结论基于\(n\lem\)。Case1.当\(n=1\)时,易得的是我们可以以\(6\)为循环节构造。Case2.当\(n=2\)时,我们可以构造出\(4a,5a,6a\)的形式。易得,通过裴蜀......
  • Yuno loves sqrt technology III
    链接:YunolovessqrttechnologyIII先考虑一道分块板子[Violet]蒲公英在这道题中,将值离散化后,用了两个重要的数组\(p_{i,j}\):表示第\(i\)个块到第\(j\)个块的最小的众数\(s_{i,j}\):表示前\(i\)个块中\(j\)出现的次数发现\(s\)的空间是\(O(n\sqrt{n})\)的\(but......
  • 「杂题乱刷2」CF1889A Qingshan Loves Strings 2
    vp到的。题目链接CF1889AQingshanLovesStrings2解题思路我们考虑从头到尾依次判断情况。维护两个指针\(l,r\)来依次比较,直到有\(a_l=a_r\)。这种情况根据题目所述是不合法的,因此我们需要依次分讨一下两种情况:\(a_l=a_r=1\),这时我们只需要在\(s_l\)前加上......