1 条题解

  • 0
    @ 2025-10-27 16:32:07

    题目分析

    本题是一个循环移位问题。nn 个小伙伴围成一圈,每轮所有小伙伴顺时针移动 mm 个位置,经过 10k10^k 轮后,求编号为 xx 的小伙伴所在的位置。


    数学建模

    设初始时位置 ii 上的小伙伴编号为 ii

    经过 11 轮后,位置 ii 上的小伙伴编号为:

    (im)modn(i - m) \bmod n

    经过 tt 轮后,位置 ii 上的小伙伴编号为:

    (imt)modn(i - m \cdot t) \bmod n

    我们要求的是经过 10k10^k 轮后,编号为 xx 的小伙伴在哪个位置 pp,即解方程:

    x(pm10k)(modn)x \equiv (p - m \cdot 10^k) \pmod{n}

    解得:

    p(x+m10k)(modn)p \equiv (x + m \cdot 10^k) \pmod{n}

    核心算法

    因此问题转化为计算:

    p=(x+m10k)modnp = (x + m \cdot 10^k) \bmod n

    由于 kk 最大可达 10910^9,直接计算 10k10^k 会溢出,需要使用快速幂算法计算 10kmodn10^k \bmod n


    代码解析

    #include <bits/stdc++.h>
    using namespace std;
    
    long long n, k, x, m;
    
    int main() {
        cin >> n >> m >> k >> x;
        
        int anss = 10, ans = 1;  // anss 是底数,ans 是结果
        
        // 快速幂计算 10^k mod n
        while (k != 0) {
            if (k & 1)  // 如果当前位为1
                ans = (ans * anss) % n;
            
            anss = (anss * anss) % n;  // 底数平方
            k >>= 1;  // 指数右移
        }
        
        // 计算最终位置
        cout << (x + m * ans) % n << endl;
        
        return 0;
    }
    

    算法步骤

    1. 输入:读取 nn, mm, kk, xx
    2. 快速幂计算 10kmodn10^k \bmod n
      • 初始化 anss = 10(底数),ans = 1(结果)
      • 遍历 kk 的二进制位:
        • 如果当前位为 11ans = (ans * anss) % n
        • 平方底数:anss = (anss * anss) % n
        • 右移指数:k >>= 1
    3. 计算最终位置p=(x+mans)modnp = (x + m \cdot \text{ans}) \bmod n
    4. 输出:位置 pp

    复杂度分析

    • 时间复杂度O(logk)O(\log k)
      • 快速幂的循环次数为 kk 的二进制位数
      • 对于 k109k \leq 10^9,最多循环约 3030
    • 空间复杂度O(1)O(1)
      • 只使用了常数个变量

    示例验证

    对于样例输入:

    n=10, m=3, k=4, x=5
    

    计算过程

    1. 计算 104mod10=010^4 \bmod 10 = 0
      • k=4k=4 的二进制:100100
      • 循环过程:
        • k=4k=4anss=10anss=(10*10)%10=0
        • k=2k=2anss=(0*0)%10=0
        • k=1k=1ans=(1*0)%10=0anss=(0*0)%10=0
    2. 计算位置:p=(5+3×0)mod10=5p = (5 + 3 \times 0) \bmod 10 = 5

    输出5,与样例一致。


    关键点说明

    • 模运算性质:$(a \cdot b) \bmod n = [(a \bmod n) \cdot (b \bmod n)] \bmod n$
    • 快速幂原理:将指数 kk 用二进制表示,通过平方和乘法分解计算
    • 循环移位等价性:顺时针移动 mm 格等价于逆时针移动 nmn-m 格,但本题采用数学推导直接得出公式

    该算法能够高效处理 kk 高达 10910^9 的大数据范围,是本题的最优解法。

    • 1

    信息

    ID
    4259
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者