【CF 285E】Positions in Permutations(容斥原理/二项式反演)

本文介绍了如何利用容斥原理和二项式反演解决关于完美数排列的问题。讨论了动态规划状态转移以及在计算过程中避免重复计数的方法,并提供了相关代码实现。

洛谷链接

题目描述

称一个 1 ∼ n 1\sim n 1n 的排列的完美数为有多少个 i i i 满足 ∣ P i − i ∣ = 1 |P_i-i|=1 Pii=1
求有多少个长度为n 的完美数恰好为 m 的排列。

Sol

f ( k ) f(k) f(k) 表示长度为 n n n 的排列恰好有 k k k 个完美数的方案数
但是发现不好算 , 我们先往容斥上想

F ( k ) F(k) F(k) 表示至少有 k k k 个的方案
先考虑一个dp , 我们考虑当前位置上的数是不是要是幸运数

f [ i ] [ j ] [ 0 / 1 ] [ 0 / 1 ] f[i][j][0/1][0/1] f[i][j][0/1][0/1]表示考虑到了第 i i i 位 , 至少已经有了 j j j 个幸运数 , i i i i + 1 i+1 i+1 是否已经被用于充当幸运数 , 其他的位置不予考虑的方案数

为什么要这样设? 因为我们只考虑当前为就很好统计个数 , 然后当前位要成为幸运数就只能是 i + 1 i+1 i+1 i − 1 i-1 i1 , 所以记录一下有没有用过

我们先自己 YY 一个转移(我这里卡常,数组换了维):

转移代码:

for(register int i=2;i<=n;++i){
    
    
	for(register int j=0;j<i;++j){
    
    
		upd(dp[0][0][i][j],dp[0][0][i-1][j]);
		upd(dp[0][0][i][j],dp[1][0][i-1][j]);
		upd(dp[1][0][i][j],dp[0][1][i-1][j]);
		upd(dp[1][0][i][j],dp[1][1][i-1][j]);
### 亚像素边缘检测中的二项式插值法 #### 原理概述 亚像素边缘检测的目标是在离散图像空间中找到更精确的边缘位置。传统的整数精度边缘检测仅能定位到像素级别,而亚像素级别的检测则能够进一步细化这一结果。二项式插值是一种常用于亚像素边缘精确定位的技术。 在实际操作中,当通过卷积运算得到梯度幅值和方向后[^1],可以通过拟合局部极值点附近的灰度分布来估计其亚像素位置。具体来说,假设某条边缘上的某个像素 \( e \) 是候选边缘点,则该点周围的邻域数据可以用二次多项式近似表示: \[ f(x) = ax^2 + bx + c \] 其中,\( f(x) \) 表示沿某一方向上的一维信号强度函数,\( a, b, c \) 则是待定系数。通过对已知的几个采样点进行最小二乘拟合即可获得这些参数。最终,在此抛物线顶点处对应的横坐标即为所求得的亚像素级位置。 对于二维情况下的边缘提取问题而言,通常先沿着垂直于初步估算出来的切向做一列投影剖面图;再利用上述提到的一元二次方程模型对该剖面上的数据序列执行最佳匹配过程从而找出最大响应所在的具体地点——这便是所谓的“双三次差值”或者叫作“高斯型曲线逼近”的思路体现形式之一[^3]。 #### 应用场景 这种技术广泛应用于计算机视觉领域内的各种任务当中,比如特征点匹配、目标追踪以及三维重建等环节都需要依赖精准可靠的边界信息作为支撑基础。特别是在一些对测量精度要求较高的场合下(如工业自动化生产线质量监控),采用此类高级别的细分手段往往可以获得更好的效果表现[^2]。 ```python import numpy as np def subpixel_edge_detection(grad_magnitude, grad_direction): """ Perform sub-pixel edge detection using parabolic interpolation. Parameters: grad_magnitude (ndarray): Gradient magnitude array. grad_direction (ndarray): Gradient direction array. Returns: ndarray: Sub-pixel refined edges positions. """ rows, cols = grad_magnitude.shape refined_edges = [] for r in range(1, rows - 1): for c in range(1, cols - 1): mag = grad_magnitude[r][c] angle = grad_direction[r][c] # Determine the neighboring pixels based on gradient orientation if (0 <= angle < 22.5 or 157.5 <= angle <= 180) or (-22.5 <= angle < 0 or -180 <= angle < -157.5): neighbors = [(r, c-1), (r, c+1)] elif 22.5 <= angle < 67.5 or -157.5 <= angle < -112.5: neighbors = [(r-1, c-1), (r+1, c+1)] elif 67.5 <= angle < 112.5 or -112.5 <= angle < -67.5: neighbors = [(r-1, c), (r+1, c)] else: # 112.5 <= angle < 157.5 or -67.5 <= angle < -22.5 neighbors = [(r-1, c+1), (r+1, c-1)] n1_mag, n2_mag = [grad_magnitude[n[0]][n[1]] for n in neighbors] # Parabola fitting coefficients calculation A = np.array([[mag**2, mag, 1], [n1_mag**2, n1_mag, 1], [n2_mag**2, n2_mag, 1]]) B = np.linalg.inv(A).dot(np.array([mag, n1_mag, n2_mag])) # Find extremum point of fitted curve vertex_x = -B[1]/(2*B[0]) refined_edges.append((r + vertex_x * np.sin(angle*np.pi/180), c + vertex_x * np.cos(angle*np.pi/180))) return np.array(refined_edges) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值