|
Pro3946 信使 题解3946. 信使 题解题目描述给定一个 $n$ 个点 $m$ 条边的有向图,$q$ 次询问从点 $u$ 走 $d$ 步到达点 $v$,且只经过点 $u,v$ 各一次的路径数。答案对 $z$ 取模。 题解原题目要求只经过起点和终点一次的路径数,这个不太好求。但是如果没有这个限制,只要求任意两点之间走 $d$ 步的路径数的话,还是很好求哒! 设 $f[i][j][d]$ 表示:从点 $i$ 走 $d$ 步无限制到达点 $j$ 的路径数。 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (e[i][j]) f[i][j][1] = 1; for (int d = 1; d <= 50; ++d) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) for (int k = 1; k <= n; ++k) if (e[k][j]) f[i][j][d] = (f[i][j][d] + f[i][k][d - 1]);
那么要求从点 $i$ 走 $d$ 步不经过点 $i,j$ 到达点 $j$ 的路径数,就转化为了从点 $i$ 走 $d$ 步无限制到达点 $j$
的路径数减去从点 $i$ 走 $
题目3946 信使
AAAAAAAAAA
2025-10-04 15:36:08
|
|
我们先考虑暴力,暴力枚举每一个$i,j$暴力算$\binom{i}{j}$时间复杂度为$O(T*N^3)$,显然超时
然后我们发现$N,M \le2000$我们考虑使用组合数的递推公式预处理$\binom{0}{0}$到$\bin 该题解待审........................................................................(剩余 717 个中英字符)
题目2559 [NOIP 2016]组合数问题
AAAAAAAAAAAAAAAAAAAA
2025-09-29 22:01:12
|
|
我们先考虑暴力,暴力枚举每一个$i,j$暴力算$\binom{i}{j}$时间复杂度为$O(T*N^3)$,显然超时 然后我们发现$N,M \le2000$我们考虑使用组合数的递推公式预处理$\binom{0}{0}$到$\binom{2000}{2000}$。 这里说一下组合数递推公式$\binom{i}{j}=\binom{i-1}{j-1}+\binom{i-1}{j}$\可以从组合意义上来理解 我们从$i$个数中选$j$个数,对于每一个数可以分为选与不选两种情况,选的时候即$\binom{i-1}{j-1}$,在剩下的$i-1$个数里选$j-1$个数,不选的时候即$\binom{i-1}{j}$,在剩下的$i-1$个数里选出$j$个数. 但是这样复杂度为$O(T*N^2+N^2)$,依旧无法通过,事实上我们需要一种不需要枚举$i,j$的方法才能通过。
我们发现对于多个询问,$k$始终为定值,于是考虑前缀和优化,设$ans_{i,j}$,在预处理时,若$k|\binom{i}{j}$,则将$an 该题解待审........................................................................(剩余 2672 个中英字符)
题目2559 [NOIP 2016]组合数问题
AAAAAAAAAAAAAAAAAAAA
2025-09-29 21:59:57
|
|
题意 题意:求∑i=1n∑j=1m[i=j](nmodi)⋅(mmodj)。 数据范围:1⩽n,m⩽109。 分析 这是一道简单的推式子题,但是实现比较恶心。 首先不妨设n⩽m(如果n>m交换一下就好了) 然后可以用容斥将题目拆成两个部分: i=1∑nj=1∑m(nmodi)⋅(mmodj)−i=1∑n(nmodi)⋅(mmodi) 将两个求和拆开: i=1∑n(nmodi)⋅j=1∑m(mmodj)−i=1∑n(nmodi)⋅(mmodi) 因为取模很难搞,所以可以用一个性质amodb=a−⌊ba⌋⋅b(取模的定义),将上式转换为: i=1∑n(n−⌊in⌋⋅i)⋅j=1∑m(m−⌊jm⌋⋅j)−i=1∑n(n−⌊in⌋⋅i)⋅(m−⌊im⌋⋅i) 将括号拆开,可以得到: (n2−i=1∑ni⋅⌊in⌋)⋅(m2−i=1∑mi⋅⌊im⌋)−i=1∑n(nm−mi⋅⌊in⌋−ni⋅⌊im⌋+i2⋅⌊in⌋⋅⌊im⌋) 此时我们的复杂度已经是O(n)了,然而这个复杂度仍然不足以通过本题。 要做这道题需要一个简单的技巧——整除分块。 我们很容易发现很多⌊in⌋的值是一样的,且所有的⌊in⌋为一个不下降子序列,呈块状分布
通 该题解待审........................................................................(剩余 3653 个中英字符)
题目3668 [清华集训 2012] 模积和
2025-09-28 20:59:31
|
|
题意 题意:求∑i=1n∑j=1m[i=j](nmodi)⋅(mmodj)。 数据范围:1⩽n,m⩽109。 分析 这是一道简单的推式子题,但是实现比较恶心。 首先不妨设n⩽m(如果n>m交换一下就好了) 然后可以用容斥将题目拆成两个部分: i=1∑nj=1∑m(nmodi)⋅(mmodj)−i=1∑n(nmodi)⋅(mmodi) 将两个求和拆开: i=1∑n(nmodi)⋅j=1∑m(mmodj)−i=1∑n(nmodi)⋅(mmodi) 因为取模很难搞,所以可以用一个性质amodb=a−⌊ba⌋⋅b(取模的定义),将上式转换为: i=1∑n(n−⌊in⌋⋅i)⋅j=1∑m(m−⌊jm⌋⋅j)−i=1∑n(n−⌊in⌋⋅i)⋅(m−⌊im⌋⋅i) 将括号拆开,可以得到: (n2−i=1∑ni⋅⌊in⌋)⋅(m2−i=1∑mi⋅⌊im⌋)−i=1∑n(nm−mi⋅⌊in⌋−ni⋅⌊im⌋+i2⋅⌊in⌋⋅⌊im⌋) 此时我们的复杂度已经是O(n)了,然而这个复杂度仍然不足以通过本题。 要做这道题需要一个简单的技巧——整除分块。 我们很容易发现很多⌊in⌋的值是一样的,且所有的⌊in⌋为一个不下降子序列,呈块状分布 ........................................................................ 该题解待审........................................................................(剩余 3621 个中英字符)
题目3668 [清华集训 2012] 模积和
AAAAAAAAAA
2025-09-28 20:51:34
|
|
题目大意 按照格雷码的生成方式,输出 n 位格雷码的第 k 号二进制串。(从 0 开始编号) 思路 填完第 k 个 n 位格雷码的第 1 位后,把它转化成某一个 n−1 位格雷码继续填这个 n−1 位格雷码的第 1 位,以此类推。 如何确定转化成第几个 n−1 位格雷码: 当 k<2n−1,因为这个 n 位格雷码的前 2n−1 个二进制串的后 n−1 位是由 n−1 位格雷码正序排列而成的,所以 k 保持不变。 当 k≥2n−1,因为这个 n 位格雷码的后 2n−1 个二进制串的后 n−1 位是由 n−1 位格雷码逆序排列而成的,所以 k 要先减去 2n−1,变成 n−1 位格雷码,再翻转才能保证是逆序的,即 k=r-k+l
题目3289 [CSP 2019S]格雷码
AAAAAAAAAAAAAAAAAAAA
![]()
2025-09-25 21:06:01
|