ABC414之

ABC414D

这道题目做一个等意变形就是有 \(n-1\) 个空隙,然后要从中选 \(m-1\) 个,问最少代价是多少,然后就很简单了。

注意特判掉 \(m\ge n\) 的情况。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,m,a[N],b[N],cnt;
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	for(int i=1;i<n;i++)
		b[i]=a[i+1]-a[i];
	if(m>=n) cout<<"0";
	else
	{
		sort(b+1,b+n);
		for(int i=1;i<=n-m;i++)
			cnt+=b[i];
		cout<<cnt;
	}
	return 0;
}

ABC414E

我们首先钦定 \(a>b>c\),那么这个时候我们枚举 \(b\),那么一个 \(a\) 对应一个 \(c\),于是我们就只需要考虑有多少个 \(a\in [b+1,N]\) 不是 \(b\) 的倍数即可,那么 \(a\) 的个数就是 \((N-b-(\lfloor\frac{N}{i}\rfloor-1)\)。那么我们就可以得到总共有 $\sum\limits_{i=2}^N N-i+1-\lfloor \frac{N}{i}\rfloor $,前面一段可以等差数列求,后面的 \(\sum\limits_{i=2}^N\lfloor \frac{N}{i}\rfloor\) 可以数论分块 \(\mathcal O(\sqrt{N})\) 求。这样我们就可以通过了。

#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353, INV = (MOD + 1) / 2;
long long H(long long n)
{
	long long res = 0;
	long long l = 1, r;
	while (l <= n)
	{
		r = n / (n / l);
		res = (res + 1LL * (r - l + 1) % MOD * (n / l) % MOD) % MOD;
		l = r + 1;
	}
	return res;
}
int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	long long n;
	cin >> n;
	long long cnt = H(n);
	n %= MOD, cnt = (cnt - n + MOD) % MOD;
	long long cnt2 = ((n - 2) * (n - 1) % MOD) * INV % MOD;
	long long cnt3 = (n - 1) % MOD;

	cout << ((cnt2 - cnt + MOD) % MOD + cnt3) % MOD;
	return 0;
}
posted @ 2025-07-13 10:41  I_AK_CTSC  阅读(27)  评论(0)    收藏  举报