ABC414之
这道题目做一个等意变形就是有 \(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;
}
我们首先钦定 \(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;
}

浙公网安备 33010602011771号