【zqsz&&loi 互测 11.6】 T1

本文介绍两种求解等比数列前n项和的方法:一是利用等比数列通项公式结合快速幂运算,并引入逆元概念解决取模问题;二是采用二分法加递归方式求解,适用于特定的等比数列求和问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题题目来源:poj 1845
原题传送门
原题求a^b的约数个数,本题作了修改:
这里写图片描述
这里写图片描述
这里写图片描述

题目很明显是求首项为1,公比为m的等比数列的前t项和

Solution 1:等比数列通项公式+快速幂

最关键的是取模用到逆元
求逆元?exgcd?费马小定理?不行不行,题目中没有说m和t-1互质
qwq get到了dalao的求逆元的通式:
求:(a/b)%m
公式:(a/b)%m=(a%(m*b))/b
证明?
已知:b|a
设 (a/b)%m=x
a/b=km+x(x < m)
a=kbm+bx
a%(bm)=bx
a%(bm)/b=x
则:(a/b)%m=(a%(m*b))/b
(ps: qly安利给我的博客)

注意开unsigned long long
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef unsigned long long ll;
ll t,m,k,ans;

ll ksm(ll x,ll p)
{
    ll di=x,ret=1,mo=k*(m-1);
    while(p)
    {
        if(p&1) ret=(ret%mo*di%mo)%mo;
        di=(di%mo*di%mo)%mo;
        p>>=1;
    }
    return ret%mo;
}
int main()
{
    cin>>m>>t>>k;
    if(m%k==0&&k!=1) ans=1;
    else if(k==1) ans=0;
    else ans=(ksm(m,t)-1)/(m-1);
    cout<<ans;
    return 0;
}

Solution 2:二分+递归求前n项和

问题:求q^0+q^1+q^2+……+q^(t-1)
由等比数列的前n项和公式可推导得:S(m+n)=Sm+Sn*q^m
设m=n=t/2(t为偶数),代入得:
St=S(t/2)+S(t/2)*q^(t/2)①
由此式递归下去,直到t==0时,返回1
注意:
函数sum(c)所求为q^0+q^1+q^2+…q^c
当c为偶数时,数列的项数为奇数即S(c+1),公式成立的条件为:t为偶数。所以求Sc+q^c。由①式可提取公因式得:Sc=S(c/2) * (1+q^(c/2))
奇数时直接求就可以了

其他细节看代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef unsigned long long ll;
ll ans,m,t,k;

ll ksm(ll p)
{
    ll di=m,ret=1;
    while(p)
    {
        if(p&1) ret=(ret%k*di%k)%k;
        di=(di%k*di%k)%k;
        p>>=1;
    }
    return ret%k;
}
ll sum(ll c)
{
    if(c==0) return 1;
    if(c&1) return (sum(c/2)*(1+ksm(c/2+1)))%k;
    return (sum(c/2-1)*(1+ksm(c/2))%k+ksm(c))%k;
}
int main()
{
    cin>>m>>t>>k;
    ans=sum(t-1);
    cout<<ans;
    return 0;
} 
### LOI Pooling 的概念与实现 LOI (Line of Interest) Pooling 是一种受目标检领域中的 RoI (Region of Interest) Pooling 和 RoI Align 启发而设计的操作方法。其主要目的是在线段检任务中,将线段映射到特征图上并生成固定大小的特征表示[^2]。 #### 背景 在计算机视觉任务中,尤其是涉及线段或边缘结构的任务(如 LCNN 中的线框分析),需要一种机制来提取特定区域内的特征并向主干网络传递梯度。传统的卷积神经网络通常会丢失空间信息,因此引入了类似于 RoI Pooling 或 RoI Align 的操作,用于处理感兴趣区域的特征提取问题。LOI Pooling 则专门针对线段这一几何对象进行了优化。 --- #### 基本概念 LOI Pooling 将一条线段视为一个兴趣区域,并将其投影到 CNN 提取的特征图上。具体来说,它通过以下方式工作: 1. **输入准备**:给定一张图像及其对应的特征图 \( F \),以及一组待检的线段坐标集合 \( L = \{l_1, l_2, ..., l_n\} \)。 2. **线段投影**:每条线段被投影到特征图的空间维度上,形成一个新的采样路径。 3. **特征聚合**:沿着这条路径采集特征值,并通过插值或其他技术生成固定的特征向量。 这种操作使得模型能够在保持高精度的同时高效地学习线段特征。 --- #### 实现细节 以下是 LOI Pooling 的典型实现流程: ##### Step 1: 定义线段范围 假设有一条线段由两个端点定义为 \( p_s(x_s, y_s), p_e(x_e, y_e) \),则该线段可以通过参数化方程描述为: \[ P(t) = (1-t)p_s + t p_e,\quad t \in [0, 1]. \] 此方程允许我们在连续域内计算任意位置上的像素坐标。 ##### Step 2: 投影至特征图 由于原始图像经过多次下采样后形成了低分辨率的特征图,需将线段两端点 \( p_s, p_e \) 映射到特征图对应的位置 \( q_s(u_s, v_s), q_e(u_e, v_e) \)[^2]。这一步骤可通过简单的缩放变换完成。 ##### Step 3: 插值采样 沿投影后的线段路径,在特征图上进行双线性插值以获取精确的特征值。设某时刻 \( t_i \) 对应于特征图上的浮点坐标 \( (u_t, v_t) \),那么附近的四个整数网格点可参与加权平均运算,最终得到当前点处的特征值[^2]。 ##### Step 4: 特征重组 最后,将所有采样的特征按顺序排列成一维向量作为输出结果。如果存在多个通道,则分别独立执行上述过程后再拼接在一起[^2]。 ```python import torch from torchvision.ops import roi_align as _roi_align def loi_pooling(features, lines, output_size=16): """ Implementation of Line-of-Interest (LoI) Pooling. Args: features (Tensor): Feature maps from backbone network with shape (B, C, H, W). lines (List[Tuple]): List of line segments defined by start and end points [(xs, ys, xe, ye)]. output_size (int): Number of samples along each LoI. Returns: Tensor: Extracted feature vectors for all given lines. """ batch_size, num_channels, height, width = features.shape pooled_features = [] for b in range(batch_size): for xs, ys, xe, ye in lines[b]: # Normalize coordinates to ROIAlign format boxes = torch.tensor([[b, min(xs, xe), min(ys, ye), max(xs, xe), max(ys, ye)]], dtype=torch.float).cuda() # Perform ROI Align on the box containing the line segment aligned_feature = _roi_align(features[[b]], boxes, (output_size, 1)) # Reshape into a vector pooled_features.append(aligned_feature.squeeze().view(num_channels, -1)) return torch.stack(pooled_features) # Example usage features = torch.randn((2, 256, 64, 64)).cuda() # Batch size 2, channels 256, spatial dims 64x64 lines = [[(10, 10, 50, 50)], [(20, 20, 70, 70)]] # Two batches, one line per image result = loi_pooling(features, lines) print(result.shape) # Output should be (number_of_lines, channel_dim * output_size) ``` --- #### 总结 LOI Pooling 结合了几何先验知识和深度学习的优势,适用于各种基于线段建模的应用场景。相比传统的方法,它的灵活性更高且更容易集成到现代框架之中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值