Skip to content

泉州一中信息学Blog

信息学奥赛技术分享博客

  • 登录
  • 小学oj
  • 中学oj
  • 测试页面1
  • Toggle search form

GDNOJ – DAY1 – [T1~T3]

Posted on 2025年7月26日 By 张, 高畅 GDNOJ – DAY1 – [T1~T3]无评论

被一堆新高一和新初三的包围了!

我要退役![大哭]

TG – A

[T1]

(53 -> 100)

原题题意:
给你 8 个图,最多用三种颜色染, 还要保证相邻区域(共边/共点)不会染成相同颜色。
现在有 k 种颜料,问对于特定的图有多少种染色方法。
注意不考虑轴对称情况,对于两种染色方案,只要有一个位置不一样,就是不同的染色方法。

TJ

好吧这个 TJ 还是太考验注意力了。

对于 2,5,6,7 这四种,是较好处理的,因为都要使用三种颜色。

对于 1,3,4,8 这四种,注意计算用三种颜料填涂方案数时减去用仅用两种颜料填涂的方案数。

然后我忘了减了。

然后就挂了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; 
int main()
{
    freopen("color.in", "r", stdin);
    freopen("color.out", "w", stdout);
    int op, k;
    scanf("%d%d", &op, &k);
    LL C2 = k * (k - 1) / 2, C3 = k * (k - 1) * (k - 2) / 6LL, res;
    if (op == 1)res = C2 * 2LL + C3 * (3LL * ((1LL << 19) - 2LL));
    else if (op == 2)res = C3 * 3LL * 2LL * 2LL * 2LL * 2LL * 2LL;
    else if (op == 3)res = C2 * 2LL + C3 * 3LL * (2LL * 2LL * 2LL - 2LL);
    else if (op == 4)res = C2 * 2LL + C3 * 3LL * (2LL * (2LL * 2LL * 2LL) * (2LL * 2LL * 2LL * 2LL) * (2LL * 2LL * 2LL * 2LL * 2LL) - 2);
    else if (op == 5)res = C3 * 3LL * 2LL * 2LL;
    else if (op == 6)res = C3 * 3LL * 2LL;
    else if (op == 7)res = C3 * 3LL * 2LL * 2LL * 2LL * 2LL * 2LL;
    else if (op == 8)res = C2 * 2LL + C3 * ((1LL << 30LL) - 4);
    printf("%lld", res);
    return 0;
}

[T2]

(40 -> 100)
TJ里有原,凑合着用

不行了一看到 DP 立马弃疗。

但是似乎做法还很多的。

预处理组合数与阶乘

定义 f_{i, j} 表示 对于前 i 个班级,存在 j 组连续的情况的方案数。(将同一班级的看为一人)

答案为 $f{n, 0} * \prod{i = 1}^{n} \prod {j = 1} ^ {r_i} j$

转移非常不明显(?)

$$f_{i, j + w_i – k – t} = f_{i, j + w_i – k – t} + f_{i – 1, j} \cdot \binom{j}{t} \cdot \binom{w_i – 1, k – 1} \cdot \binom{sum_{i – 1} + 1 – j}{k – t}$$

$k$ 为第 $i$ 个班分为 $k$ 组(每一组连续)

$t$ 为 $k$ 组中有 $t$ 组插在之前的 $j$ 个位置上

$\binom{j}{t}$ 是在j个位置中枚举t个位置

$\binom{w_i – 1, k – 1}$是将第 $i$ 个班的人分为 $k$ 组的方案数

$\binom{sum_{i – 1} + 1 – j}{k – t}$是在剩下的位置中枚举位置。

当然还可以用二项式反演,但是忘完了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 55, M = 1505, mod = 1e9 + 7;
int n, w[N], sum[N];
LL C[M][M], fac[M], f[N][M];
int main()
{
    freopen("photo.in", "r", stdin);
    freopen("photo.out", "w", stdout);
    fac[0] = C[0][0] = 1;
    for (int i = 1; i < M; i ++)
    {
        fac[i] = fac[i - 1] * i % mod;
        for (int j = 0; j < M; j ++)
        {
            if (!j)C[i][j] = 1;
            else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
        }
    }
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++)
    {
        scanf("%d", &w[i]);
        sum[i] = sum[i - 1] + w[i];
    }
    f[1][sum[1] - 1] = 1;
    for (int i = 2; i <= n; i ++)
    {
        for (int j = 0; j <= sum[i - 1]; j ++)
        {
            if (!f[i - 1][j])continue;
            for (int k = 1; k <= w[i]; k ++)
            {
                for (int t = 0; t <= min(k, j); t ++)f[i][j + w[i] - k - t] = (f[i][j + w[i] - k - t] + (f[i - 1][j] * C[j][t] % mod * C[w[i] - 1][k - 1] % mod * C[sum[i - 1] + 1 - j][k - t] % mod) % mod) % mod;
            }
        }
    }
    LL res = f[n][0];
    for (int i = 1; i <= n; i ++)res = res * fac[w[i]] % mod;
    printf("%lld", res);
    return 0;
}

[T3]

(30 -> 100)
TJ有原,凑合着用

没想到是折半搜索。

想到了基本上就没了,记三个状态, i 表示当前点, S 表示遍历情况, dist 表示当前所走过距离。

注意这个 hash_table 需要自己写, unordered_map 在 GDNOJ 上实现的效率实在是太差了。

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int n, m, res;
int w[N][N], bit[N];
typedef long long LL;
unordered_map<LL, int> mp;
const int Size = 2e7 + 5, mod = 1e7 + 19;
struct node
{
    int u, S, dist, cnt;
}table[Size];
void Hash(int u, int S, int dist)
{
    int cur = 1LL * u * S % mod * dist % mod;
    while(table[cur].cnt)
    {
        if (table[cur].u == u && table[cur].S == S && table[cur].dist == dist)
        {
            table[cur].cnt ++;
            return;
        }
        cur ++;
        if (cur >= Size) cur = 0;
    }
    table[cur] = {u, S, dist, 1};
}
int get_hash(int u, int S, int dist)
{
    int cur = 1LL * u * S % mod * dist % mod;
    while(table[cur].cnt)
    {
        if (table[cur].u == u && table[cur].S == S && table[cur].dist == dist)return table[cur].cnt;
        cur ++;
        if (cur >= Size) cur = 0;
    }
    return 0;
}
void dfs1(int step, int u, int S, LL dist)
{
    if (dist > m)return;
    if (!step)
    {
        Hash(u, S, dist);
        return;
    }
    for (int i = 1; i < n; i ++)
    {
        if (S & bit[i])continue;
        dfs1(step - 1, i, S | bit[i], dist + w[u][i]);
    }
}
void dfs2(int step, int u, int S, LL dist)
{
    if (dist > m)return;
    if (!step)
    {
        res += get_hash(u, (((bit[n] - 1) ^ S) | bit[u]) | 1, m - dist);
        return;
    }
    for (int i = 1; i < n; i ++)
    {
        if (S & bit[i])continue;
        dfs2(step - 1, i, S | bit[i], dist + w[u][i]);
    }
}
int main()
{
    freopen("way.in", "r", stdin);
    freopen("way.out", "w", stdout);
    scanf("%d%d", &n, &m);
    bit[0] = 1;
    for (int i = 1; i <= n; i ++)bit[i] = bit[i - 1] << 1;
    for (int i = 0; i < n; i ++)
    {
        for (int j = 0; j < n; j ++)scanf("%d", &w[i][j]);
    }
    dfs1(n >> 1, 0, 1, 0);
    dfs2(n - (n >> 1), 0, 1, 0);
    printf("%d", res); 
    return 0;
}

SX

都没看,先贴个链接
T1
T2
T3

训练日志, 并查集, 迭代搜索, 哈希表, 树状数组, 数学, 容斥原理

文章导航

Previous Post: 2025暑假中山集训Day1——7.26
Next Post: 中山纪念中学 Day1

发表回复 取消回复

要发表评论,您必须先登录。

2025年 12月
一 二 三 四 五 六 日
1234567
891011121314
15161718192021
22232425262728
293031  
« 8月    

2024常州 Class Classic OI Problems Contest cqr的长乐集训2023 CZYZ LOC New Game NOI NOIP Password Protected PM_PK Preview Problems Retrospect Selfmade Qusetion STL The end Training Uneasy Problem 蒟蒻 通报

  • 训练日志
  • 链表
  • 入门
  • 模拟
  • dfs序
  • 并查集
  • spfa
  • 最小割
  • 矩阵树定理
  • 仙人掌
  • BSGS
  • 凸包
  • 回文自动机
  • 递推与动归
  • 堆
  • 莫队算法
  • ST表
  • Treap
  • 树套树
  • 可持久化线段树
  • 初赛
  • 搜索
  • 贪心
  • 深度优先搜索
  • 欧拉图
  • dijkstra
  • 费用流
  • 哈夫曼树
  • kruskual
  • 置换
  • 旋转卡壳
  • KMP
  • 区间动归
  • STL
  • 链表
  • 可并堆
  • sply
  • 主席树
  • 可持久化字典树
  • 算法
  • 动态规划
  • 构造
  • 广度优先搜索
  • 最短路
  • floyd
  • 最大流
  • 虚树
  • prim
  • 筛法
  • 半平面交
  • 字典树
  • 背包动归
  • 基础数据结构
  • 分块
  • 线段树
  • 替罪羊树
  • K-DTree
  • 图论
  • 二分法
  • 迭代搜索
  • 拓扑排序
  • 有上下界网络流
  • 生成树
  • 快速幂
  • 后缀数组
  • 树形动归
  • 哈希表
  • 中级数据结构
  • 平衡树
  • 可持久化数据结构
  • 数据结构
  • 三分法
  • 启发式搜索
  • 图的连通
  • 点分治
  • 博弈论
  • AC自动机
  • 状压动归
  • 单调栈
  • 树状数组
  • 高级数据结构
  • OI资料
  • 数学
  • 高精度
  • 差分约束
  • 树上倍增
  • 素数测试
  • 后缀自动机
  • 数位动归
  • 单调队列
  • 新闻
  • 几何
  • 随机化
  • 二分图染色
  • 树链剖分
  • 欧拉函数
  • manacher
  • 斜率优化
  • 离线处理
  • 信息学奥赛学长风采
  • 字符串
  • 二分图匹配
  • prufer编码
  • 卡特兰数
  • 密码学
  • 决策单调
  • 赛后总结
  • 其他
  • 2-SAT
  • 最近公共祖先
  • 矩阵乘法
  • 记忆化搜索
  • 网络流
  • Link cut tree
  • 排列组合
  • 树
  • 高斯消元
  • 乘法逆元
  • 容斥原理
  • 调和级数
  • 概率与期望
  • 模线性方程组
  • 莫比乌斯反演
  • 快速傅里叶变换
  • 扩展欧几里德
  • 最大公约数与最小公倍数

近期文章

  • 中山纪念中学 Day21
  • 中山集训8.15 LAST DAY+集训小结
  • GDNOJ – DAY 18
  • 中山8.14
  • 2025暑假中山集训Day20——8.14

近期评论

归档

  • 2025年8月
  • 2025年7月
  • 2025年2月
  • 2025年1月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月

Copyright © 2025 泉州一中信息学Blog.

Powered by PressBook WordPress theme