2022icpc杭州铜牌题题解

A. Modulo Ruins the Legend

sd使ai+sn+dn(n+1)2 (modm)sum=ai (modm)t=gcd(n,n(n+1)2)=sum+kt (modm)tmsum+kt (modm)sum+kt+pm (modm)g=gcd(t,m)=sum+qg (modm)g | mm/gq=msumg

LL exgcd(LL a, LL b, LL &x, LL &y) {
if (!b) {
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
void work() {
LL n, m;
cin >> n >> m;
LL sum = 0;
rep (i, 1, n) {
LL x;
cin >> x;
sum = (sum + x) % m;
}
LL x_s, y_d;
LL t = exgcd(n, n * (n + 1) / 2, x_s, y_d);
LL x_k, y_p;
LL g = exgcd(t, m, x_k, y_p);
LL q = (m - sum + g - 1) / g;
LL s = q * x_k % m * x_s % m, d = q * x_k % m * y_d % m;
cout << (q * g + sum) % m << endl;
cout << (s + m) % m << " " << (d + m) % m << endl;
}

C. No Bug No Game

dp[i][j][0/1]ijiii:dp[i][j][0/1]=inf,dp[0][0][0]=0

int n, k, s;
int p[N][11], dp[N][N][2]; // dp[i][j][0/1]:从前i个物品中选,体积为j,是否完全的最大值
void work() {
cin >> n >> k;
rep (i, 1, n) {
cin >> p[i][0];
s += p[i][0];
rep (j, 1, p[i][0]) cin >> p[i][j];
}
memset(dp, -0x3f, sizeof dp);
dp[0][0][0] = 0;
rep (i, 1, n) {
rep (j, 0, k) {
//不选第i个物品
dp[i][j][0] = dp[i - 1][j][0];
dp[i][j][1] = dp[i - 1][j][1];
//完全选择第i个物品
if (p[i][0] <= j) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - p[i][0]][0] + p[i][p[i][0]]); //完全更新完全
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - p[i][0]][1] + p[i][p[i][0]]); //完全更新不完全
}
//不完全选择第i个物品
rep (t, 1, p[i][0] - 1) {
if (t <= j) dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - t][0] + p[i][t]); //不完全更新完全
else break;
}
}
}
if (s <= k) cout << dp[n][s][0] << endl;
else cout << max(dp[n][k][0], dp[n][k][1]) << endl;
}

K. Master of Both

#define int long long
int n, q;
int son[N][30], cnt[N][30], idx = 1;
int mp[26][26], ex;
void insert(string s){
int cur = 0;
for (int i = 0; i < s.length(); i++) {
if (!son[cur][s[i] - 'a']) son[cur][s[i] - 'a'] = idx++;
rep (j, 0, 25) {
if (j == s[i] - 'a') continue;
mp[s[i] - 'a'][j] += cnt[cur][j];
}
cnt[cur][s[i] - 'a']++;
cur = son[cur][s[i] - 'a'];
}
rep (i, 0, 25) ex += cnt[cur][i];
}
void work() {
cin >> n >> q;
rep (i, 1, n) {
string s;
cin >> s;
insert(s);
}
rep (i, 1, q) {
string s;
cin >> s;
int res = ex;
rep (i, 0, 25) rep (j, i + 1, 25) res += mp[s[i] - 'a'][s[j] - 'a'];
cout << res << endl;
}
}

本文作者:xhy666

本文链接:https://www.cnblogs.com/xhy666/p/16975726.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xhy666  阅读(1253)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起