UR #1
A. 缩进优化
题目描述
有
思路
我们先对值的出现次数做一个前缀和,然后枚举
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXV = 1000001;
int n, sum[MAXV];
ll ans = (ll)(1e18), cnt[MAXV];
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for(int i = 1, x; i <= n; ++i) {
cin >> x;
sum[x]++;
cnt[x] += x;
}
for(int i = 1; i < MAXV; ++i) {
sum[i] += sum[i - 1];
cnt[i] += cnt[i - 1];
}
for(int i = 1; i < MAXV; ++i) {
ll res = 0;
for(int j = 0; i * j < MAXV; ++j) {
res += 1ll * j * (sum[min(MAXV - 1, i * (j + 1) - 1)] - (!j ? 0 : sum[i * j - 1])) + (cnt[min(MAXV - 1, i * (j + 1) - 1)] - (!j ? 0 : cnt[i * j - 1])) - 1ll * i * j * (sum[min(MAXV - 1, i * (j + 1) - 1)] - (!j ? 0 : sum[i * j - 1]));
}
ans = min(ans, res);
}
cout << ans;
return 0;
}
B. 外星人
题目描述
给定一个数
思路
显然当我们模完一个较小的数后,再模较大的数就没有意义了,所以如果我们想跳过一个数,那么只需把它丢到更小的数后面。因此先对
令
时空复杂度均为
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1001, MAXV = 5001, MOD = 998244353;
int n, x, a[MAXN], dp[MAXN][MAXV];
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> x;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
sort(a + 1, a + n + 1, greater<int>());
dp[0][x] = 1;
for(int i = 0; i < n; ++i) {
for(int j = 0; j <= x; ++j) {
dp[i + 1][j] = (dp[i + 1][j] + 1ll * dp[i][j] * (n - i - 1) % MOD) % MOD;
dp[i + 1][j % a[i + 1]] = (dp[i + 1][j % a[i + 1]] + dp[i][j]) % MOD;
}
}
for(int i = x; i >= 0; --i) {
if(dp[n][i]) {
cout << i << "\n" << dp[n][i];
return 0;
}
}
return 0;
}
本文作者:Yaosicheng124
本文链接:https://www.cnblogs.com/yaosicheng124/p/18446464
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步