鱼C论坛

 找回密码
 立即注册
查看: 2605|回复: 11

[心之碎片] - 20240817模拟赛

[复制链接]
发表于 2024-8-21 22:23:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
总结与反思
B - 对于求权值总和 / 乘积 等于定值要想到背包dp
C - sgt 维护的值看看是否冗余, 只需要单点修改的东西不需要进入 up 和 dn



B - ppip 数列
ppip看到了一个各元素均为正整数、长度为k、各元素之和为n的不降数列。
他想要知道这种数列的个数,对998244853取模。

转化为 权值为 1 - k 的物品, 不限制取的个数, 总和为 n 的方案数, 转化为完全背包问题

在遇到【不易处理的限制】与【就算有限制也很好处理,可惜没限制】的问题时,可以通过转转转将其转化。
原本横向的性质,在新问题上必须纵向考虑。
对于有关【整数】、【重复】等的问题,可考虑将【有无】与【数量之差】相互转化。

  1. f[0] = 1;
  2.     cin >> n >> k;
  3.     n -= k;

  4.     for (int i = 1; i <= k; i++) {
  5.         for (int j = i; j <= n; j++) {
  6.             f[j] = (f[j] + f[j - i]) % P;
  7.         }
  8.     }

  9.     cout << f[n];
复制代码


D - P4472 [BJWC2018] 八维
倍增, 哈希
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. typedef unsigned long long ll;
  4. typedef pair<int, int> pii;

  5. const int N = 505;
  6. const ll B = 233;
  7. const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
  8. const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};

  9. char s[N][N];
  10. int n, m, K;
  11. ll p[N], f[N][N][30];
  12. long long same, all;
  13. pii g[N][N][30];
  14. unordered_map<ll, int> cnt;

  15. int main(){
  16.     ios::sync_with_stdio(0);
  17.     cin.tie(0);

  18.     cin >> n >> m >> K;
  19.     for(int i = 0; i < n; i++){
  20.         cin >> s[i];
  21.     }

  22.     int lim = log2(K);
  23.     p[0] = B;
  24.     for(int i = 1; i <= lim; i++){
  25.         p[i] = p[i - 1]*p[i - 1];
  26.     }

  27.     for(int d = 0; d < 8; d++){
  28.         // 录入 f, g
  29.         for(int i = 0; i < n; i++){
  30.             for(int j = 0; j < m; j++){
  31.                 f[i][j][0] = s[i][j];
  32.                 g[i][j][0] = make_pair((i + dx[d] + n) % n, (j + dy[d] + m) % m);
  33.             }
  34.         }

  35.         // 倍增
  36.         for(int k = 1; k <= lim; k++){
  37.             for(int i = 0; i < n; i++){
  38.                 for(int j = 0; j < m; j++){
  39.                     int x = g[i][j][k - 1].first;
  40.                     int y = g[i][j][k - 1].second;

  41.                     f[i][j][k] = f[i][j][k - 1]*p[k] + f[x][y][k - 1];
  42.                     g[i][j][k] = g[x][y][k - 1];
  43.                 }
  44.             }
  45.         }

  46.         for(int i = 0; i < n; i++){
  47.             for(int j = 0; j < m; j++){
  48.                 ll hash = 0;
  49.                 auto cur = make_pair(i, j);

  50.                 for(int k = lim; k >= 0; k--){
  51.                     if((K >> k) & 1){
  52.                         hash = hash*p[k] + f[cur.first][cur.second][k];
  53.                         cur = g[cur.first][cur.second][k];
  54.                     }
  55.                 }

  56.                 cnt[hash]++;
  57.             }
  58.         }
  59.     }

  60.     for(auto v : cnt){
  61.         same += 1ll*v.second*v.second;
  62.     }
  63.     all = 64ll*n*n*m*m;

  64.     cout << same / __gcd(same, all) << '/' << all / __gcd(same, all);

  65.     return 0;
  66. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
~风介~ + 5 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-21 22:23:37 | 显示全部楼层
在这段描述中,你提到了两道题,以及你对解决方案的总结与反思。让我为你进一步简化和解释:

### B - ppip 数列

#### 问题描述:
你需要找到所有长度为k的、不降的正整数数列,这些数列的元素之和为n,并对结果进行取模运算。

#### 解题思路:
这个问题可以通过将其转换为完全背包问题来解决:
1. 视每个数列元素为背包中的物品,每个物品的权值为1到k。
2. 求权值总和为\(n - k\)的方案数。

#### 解决方法:
使用动态规划来解决背包问题。你的思路是正确的,可以通过完全背包的DP实现。

#### 示例代码:
  1. #include <iostream>
  2. #include <vector>
  3. #define MOD 998244853

  4. using namespace std;

  5. int main() {
  6.     int n, k;
  7.     cin >> n >> k;
  8.     n -= k;

  9.     vector<int> dp(n + 1, 0);
  10.     dp[0] = 1;

  11.     for (int i = 1; i <= k; ++i) {
  12.         for (int j = i; j <= n; ++j) {
  13.             dp[j] = (dp[j] + dp[j - i]) % MOD;
  14.         }
  15.     }
  16.    
  17.     cout << dp[n] << endl;
  18.     return 0;
  19. }
复制代码


### C - sgt 维护的值看看是否冗余
你提到`sgt`(线段树)需要维护的值时,需要确认是否存在冗余。对于只需要单点修改的情况,不需要进入`up`和`dn`。

### 总结:
1. **转化思路** - 对于不容易处理的复杂限制条件,可以尝试通过不同的角度(例如横向与纵向转换)来简化问题。
2. **背包问题** - 遇到求解和或积等于某定值的问题时,可以通过背包DP的方式来解决。
3. **数据结构优化** - 在使用数据结构如线段树时,确保操作的值没有冗余,优化复杂度。对于单点修改,只需要更新相关节点,不需要进行其他多余操作。

希望这些解答能帮助你更清晰地理解和解决这些问题!如果还有其他不明白的地方,随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-22 08:58:28 | 显示全部楼层

回帖奖励 +3 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-22 12:31:54 | 显示全部楼层

回帖奖励 +3 鱼币

666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-22 20:21:44 | 显示全部楼层

回帖奖励 +3 鱼币

666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-23 09:37:00 | 显示全部楼层

回帖奖励 +3 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-23 16:17:43 | 显示全部楼层

回帖奖励 +3 鱼币

闻币而来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-23 16:22:16 | 显示全部楼层

回帖奖励 +3 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-24 11:45:56 | 显示全部楼层

回帖奖励 +3 鱼币

&#128076;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 09:24:56 | 显示全部楼层

回帖奖励 +3 鱼币


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-1 10:02:20 | 显示全部楼层

回帖奖励 +3 鱼币

看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-4 17:16:53 | 显示全部楼层

回帖奖励 +3 鱼币

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 17:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表