社区讨论
本地和 CF 时间差异过大是什么原因
学术版参与者 6已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mhj289wz
- 此快照首次捕获于
- 2025/11/03 19:31 4 个月前
- 此快照最后确认于
- 2025/11/03 19:31 4 个月前
题目:CF1542E2。
代码:
CPP#pragma GCC optimize(2, 3, "Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 505
int n, ans, MOD, DE; ll f[2][MAXN*MAXN], s[2][MAXN*MAXN], sp[2][MAXN*MAXN], fac[MAXN], C[MAXN][MAXN];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> MOD;
DE = n*(n-1)/2; fac[0] = 1; for (int i(1); i<MAXN; ++i) fac[i] = fac[i-1]*i%MOD;
for (int i(0); i<MAXN; ++i){C[i][0]=1; for (int j(1); j<=i; ++j) C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;} f[0][DE] = 1;
for (int i(0); i<=2*DE; ++i) s[0][i] = ((i ? s[0][i-1] : 0)+f[0][i]) % MOD, sp[0][i] = ((i ? sp[0][i-1] : 0)+f[0][i]*i) % MOD;
for (int i(1), c(1); i<=n; ++i, c^=1){
for (int x(0); x<i; ++x) for (int y(x+1); y<i; ++y) (ans += s[c^1][x-y-1+DE]*fac[n-i]%MOD*C[n][i]) %= MOD;
for (int j(0); j<=2*DE; ++j){
f[c][j] = 0;
(f[c][j] += (i-j)*(s[c^1][max(j-1, 0)]-s[c^1][max(j-i, 0)])%MOD+MOD+(sp[c^1][max(j-1, 0)]-sp[c^1][max(j-i, 0)])) %= MOD;
(f[c][j] += (i+j)*(s[c^1][min(2*DE, j+i-1)]-s[c^1][j]+MOD)-(sp[c^1][min(2*DE, j+i-1)]-sp[c^1][j]+MOD)%MOD+MOD) %= MOD;
(f[c][j] += f[c^1][j]*i) %= MOD;
s[c][j] = ((j ? s[c][j-1] : 0)+f[c][j]) % MOD; sp[c][j] = ((j ? sp[c][j-1] : 0)+f[c][j]*j) % MOD;
}
}
cout << ans;
return 0;
}
输入数据:
CPP500 1000000000
本地 NOI Linux 下是 1.5s 以内,但是在 CF 上的自定义测试中跑了 8.5s。使用的是 C++20。
回复
共 8 条回复,欢迎继续交流。
正在加载回复...