首页 > 其他分享 >Solution - Luogu P11402 [Code+#8 初赛] 图

Solution - Luogu P11402 [Code+#8 初赛] 图

时间:2024-12-23 22:11:06浏览次数:3  
标签:+# lfloor Code frac limits dfrac 初赛 3i rfloor

首先通过手玩,发现对于小的 \(n\) 都有 \(m_{\max}\le n\),于是直接猜测这个结论并尝试证明。

首先对于 \(n\le 4\) 的情况,首先可以直接通过手玩知道 \(m_{\max}\le n\)。
对于 \(n > 4\) 的情况,考虑 \(n\) 从小到大证明。
若 \(m > n\),则 \(\sum\limits_{i = 1}^n \operatorname{deg}_i > 2n\),那么一定存在 \(\operatorname{deg}_i > 2\),且此时与 \(i\) 有连边的点一定不能与其他点有连边了。
此时只连了 \(\operatorname{deg}_i\) 条边,却独立出了 \(\operatorname{deg}_i + 1\) 个点,于是会递归到 \(m' = m - \operatorname{deg}_i, n' = n - \operatorname{deg}_i - 1\) 的情况,此时一定有 \(m' > n'\) 且对于 \(n'\) 一定满足 \(m'_{\max}\le n'\),于是不存在合法的构造。
所以可以证得 \(m_{\max}\le n\)。

接下来考虑什么情况下能取到 \(m_{\max} = n\)。
首先类似上面的证明,可以知道一定不能存在 \(\operatorname{deg}_i > 2\),即此时一定满足 \(\forall 1\le i\le n, \operatorname{deg}_i = 2\)。
考虑对于 \(i\),令连边为 \((i, j), (i, k)\),能够知道此时要满足条件只能连上 \((j, k)\) 这条边,然后递归到 \(n' = n - 3, m' = m - 3\) 的情况。

于是可以知道,只有当 \(n\bmod 3 = 0\) 时有 \(m_{\max} = n\),此时对应的构造为 \(\frac{n}{3}\) 个三元环。
对于 \(n\bmod 3 \not = 0\),直接构造一个菊花就可以构造出 \(m_{\max} = n - 1\),但是注意最终形态不一定只有菊花,也可以是一些三元环加上一个菊花(但是菊花一定只有 \(1\) 个,因为如果多一个 \(m\) 最大就只能是 \(n - 2\) 了)。

然后来考虑计数。

首先因为 \(n\bmod 3 \not = 0\) 也可能有三元环出现,所以先考虑计数三元环。

此时可以考虑 dp,令 \(g_n\) 为点数为 \(3n\),分出 \(n\) 个三元换的个数。
那么考虑 \(3n\) 所在的三元环,另外 \(2\) 个数就应该是 \(1\sim 3n - 1\) 中的任意 \(2\) 个,于是有 \(g_n = \binom{3n - 1}{2}g_{n - 1}\)。

那么 \(n\bmod 3 = 0\) 就处理完了。
接下来考虑处理 \(n\bmod 3 \not = 0\) 的情况,那么就可以,枚举三元环的个数,然后对于菊花的点定根(注意 \(n = 2\) 时的特殊情况)就有:
\(\operatorname{ans} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} g_{i} \dbinom{n}{3i}(n - 3i - [n - 3i = 2])\)。

但这样肯定是做不了线性的,于是观察 \(g_{n} = \binom{3n - 1}{2}g_{n - 1} = \frac{(3n - 1)(3n - 2)}{2}g_i = \frac{3n(3n - 1)(3n - 2)}{6n} g_{i - 1}\)。
所以有 \(g_n = \dfrac{(3n)!}{n!6^n}\)。

代入 \(\operatorname{ans}\) 有 \(\operatorname{ans} = - [n \bmod 3 = 2]\dbinom{n}{2}g_{\lfloor\frac{n}{3}\rfloor} + \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} g_{i} \dbinom{n}{3i}(n - 3i) = - [n \bmod 3 = 2]\dbinom{n}{2}g_{\lfloor\frac{n}{3}\rfloor} + \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{(3i)!n!(n - 3i)}{i!6^i(3i)!(n - 3i)!} = - [n \bmod 3 = 2]\dbinom{n}{2}g_{\lfloor\frac{n}{3}\rfloor} + n! \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{(n - 3i)}{i!6^i(n - 3i)!}\)。

那么接下来的问题就是线性预处理 \(f'_n = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{n - 3i}{(n - 3i)!i!6^i} = \sum\limits_{i = 0}^{\lfloor\frac{n - 1}{3}\rfloor} \dfrac{n - 3i}{(n - 3i)!i!6^i} = \sum\limits_{i = 0}^{\lfloor\frac{n - 1}{3}\rfloor} \dfrac{1}{(n - 3i - 1)!i!6^i}\)。
所以令 \(f_n = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{1}{(n - 3i)!i!6!}\),那么有 \(f'_n = f_{n - 1}\)。

然后考虑找 \(f_n\) 的递推关系。
考虑分母的 \(n - 3i\),于是代入 \(f_{n - 3} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor - 1} \dfrac{1}{(n - 3i - 3)!i!6!} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor - 1} \dfrac{1}{(n - 3(i + 1))!i!6!} = \sum\limits_{i = 1}^{\lfloor\frac{n}{3}\rfloor} \dfrac{1}{(n - 3i)!(i - 1)6^{i - 1}} = \sum\limits_{i = 1}^{\lfloor\frac{n}{3}\rfloor} \dfrac{6i}{(n - 3i)!i!6^i} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{6i}{(n - 3i)!i!6^i}\)。
那么肯定是想把 \(6i\) 消成常数的,那么从上面通分启发,代入 \(f_{n - 1} = \sum\limits_{i = 0}^{\lfloor\frac{n - 1}{3}\rfloor} \dfrac{1}{(n - 3i - 1)!i!6^i} = \sum\limits_{i = 0}^{\lfloor\frac{n - 1}{3}\rfloor} \dfrac{n - 3i}{(n - 3i)!i!6^i} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{n - 3i}{(n - 3i)!i!6^i}\)。

所以发现有 \(\dfrac{f_{n - 3}}{2} + f_{n - 1} = \sum\limits_{i = 0}^{\lfloor\frac{n}{3}\rfloor} \dfrac{n}{(n - 3i)!i!6^i} = n f_n\),所以有 \(f_n = \dfrac{f_{n - 1} + \frac{f_{n - 3}}{2}}{n}\)。
特殊处理一下 \(f_{0\sim 2}\) 的边界情况即可。

那么对于 \(n\bmod 3\not = 0\) 的情况,就有 \(\operatorname{ans} = - [n \bmod 3 = 2]\dbinom{n}{2}g_{\lfloor\frac{n}{3}\rfloor} + n!f_{n - 1}\)。

时间复杂度 \(\mathcal{O}(n + q)\)。

代码中的 \(f, g\) 含义是反过来的。

#include<bits/stdc++.h>
using ll = long long;
constexpr int maxn = 3e7 + 10, N = 3e7, M = 1e7;
ll mod;
inline ll qpow(ll a, ll b, ll v = 1) {
   while (b) {
      if (b & 1) (v *= a) %= mod;
      (a *= a) %= mod, b >>= 1;
   }
   return v;
}
ll fac[maxn], ifac[maxn], inv[maxn];
inline ll binom(int n, int m) {
   return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}
ll f[maxn], g[maxn];
int main() {
   int q;
   scanf("%d%lld", &q, &mod);
   for (int i = fac[0] = 1; i <= N; i++) fac[i] = fac[i - 1] * i % mod;
   ifac[N] = qpow(fac[N], mod - 2);
   for (int i = N; i; i--) ifac[i - 1] = ifac[i] * i % mod;
   for (int i = inv[0] = 1; i <= N; i++) inv[i] = ifac[i] * fac[i - 1] % mod;
   const ll inv2 = inv[2], inv6 = inv[6];
   ll pw = 1ll;
   for (int i = 0; i <= M; i++) {
      f[i] = fac[3 * i] * ifac[i] % mod * pw % mod;
      (pw *= inv6) %= mod;
   }
   g[0] = g[1] = 1, g[2] = inv[2];
   for (int i = 3; i <= N; i++) {
      g[i] = (g[i - 1] + g[i - 3] * inv2 % mod) * inv[i] % mod;
   }
   for (int n; q--; ) {
      scanf("%d", &n);
      if (n % 3 == 0) {
         printf("%lld\n", f[n / 3] % mod);
         continue;
      }
      ll ans = g[n - 1] * fac[n] % mod;
      if (n % 3 == 2) {
         (ans += mod - binom(n, 2) * f[n / 3] % mod) %= mod;
      }
      printf("%lld\n", ans);
   }
   return 0;
}

标签:+#,lfloor,Code,frac,limits,dfrac,初赛,3i,rfloor
From: https://www.cnblogs.com/rizynvu/p/18625055

相关文章

  • python毕设 上门废品回收系统 小程序端论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于废品回收系统的研究,现有研究主要以传统废品回收模式为主,专门针对上门废品回收系统,尤其是基于Python开发的上门废品回收系统的研究......
  • Codeforces Round 995 (Div. 3)(补题)
    CodeforcesRound995(Div.3)D.CountingPairs(离散化+二分)题目描述给你一个由\(n\)个整数组成的序列\(a\),其中序列的\(i\)-th元素等于\(a_i\)。同时还给出两个整数\(x\)和\(y\)(\(x\ley\))。如果满足以下条件,一对整数\((i,j)\)就会被认为是有趣的:\(1......
  • 修改 `invite_codes` 表中 `code` 字段名为 `invite_code`
    --auto-generateddefinitioncreatetableinvite_codes(idintauto_incrementprimarykey,codevarchar(6)notnullcomment'邀请码,6位整数,确保在有效期内......
  • Vscode实现应用qss样式表
    qss简介qss(QtStyleSheets)是一种基于CSS的样式语言,用于描述用户界面元素的外观和感觉。qss可以让用户在不修改代码的情况下,轻松地自定义应用程序的外观。其语法基本如下:objectName{property:value;}其中,objectName是要设置样式的对象名,property是要设置的属性,value是属......
  • 【LeetCode】LCR 175.计算二叉树的深度
    题目链接:LCR175.计算二叉树的深度题目描述:思路一(深度优先搜索):使用深度优先搜索算法进行二叉树后序遍历复杂度分析:时间复杂度O(N):N为树的节点数量,计算树的深度需要遍历所有节点空间复杂度O(N):最差情况下(当树退化为链表时),递归深度可达到N/***Definitionfor......
  • springboot毕设 足球管理系统的设计与实现 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景足球,作为全球最受欢迎的体育运动之一,不仅承载着无数人的热情与梦想,也促进了体育产业的蓬勃发展。随着信息技术的不断进步,足球运动的管理逐渐从传统的......
  • springboot毕设 智慧点餐系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和人们生活节奏的加快,餐饮行业正面临着前所未有的变革。传统的点餐方式不仅效率低下,还难以满足消费者日益增长的个性化需求。......
  • springboot毕设 智慧迎新系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和高校信息化建设的不断深入,智慧校园的概念逐渐深入人心。智慧迎新系统作为智慧校园的重要组成部分,旨在通过信息化手段优化新......
  • C++中的.inc文件
    在C++中,.inc文件通常是指包含文件(IncludeFile),但它们的使用场景与.h(头文件)略有不同。.inc文件并没有标准的文件扩展名,实际上它是开发人员自定义的一个命名方式。以下是关于.inc文件的详细说明:1.什么是.inc文件?.inc文件一般用于存放代码的某些片段或配置,通常是......
  • C++中预定义宏
    C++中有许多预定义宏,这些宏在程序编译时由编译器自动定义,并可以在代码中使用。预定义宏通常用于调试、条件编译、文件信息、平台特定配置等方面。以下是一些常见的预定义宏及其具体使用方法和示例。1.__FILE__说明:__FILE__是一个字符串宏,表示当前源代码文件的名称(包括路......