萌新关于取模的一点疑惑
  • 板块学术版
  • 楼主cmaths
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/10/2 12:05
  • 上次更新2023/11/4 05:10:20
查看原帖
萌新关于取模的一点疑惑
300098
cmaths楼主2021/10/2 12:05

题目

自己在大部分题解公式的基础上提了一个m,然后想用普通的快速幂做,但是考虑到如果一律modmod 100003100003可能导致mn1(m1)n1m^ {n - 1} - (m - 1) ^ {n - 1}出现负数,就想多保留一位,但是wtcl不知道怎么做,只好modmod10000301000030

#include <cstdio>

long long fst(long long a, long long b)
{
    long long base = a, ans = 1;
    while(b)
    {
        if(b & 1)
            ans *= base;
        base *= base;
        ans %= 1000030;
        base %= 1000030;
        b >>= 1;
    }
    return ans;
}
int main()
{
    long long m, n;
    scanf("%lld %lld", &m, &n);
    printf("%lld", m * ((fst(m, n - 1) - fst(m - 1, n - 1) % 100003)) % 100003);
    return 0;
}

很神奇地A了……

然后试图换成modmod 100003100003提高效率

#include <cstdio>

long long fst(long long a, long long b)
{
    long long base = a, ans = 1;
    while(b)
    {
        if(b & 1)
            ans *= base;
        base *= base;
        ans %= 100003;
        base %= 100003;
        b >>= 1;
    }
    return ans;
}
int main()
{
    long long m, n;
    scanf("%lld %lld", &m, &n);
    printf("%lld", m * ((fst(m, n - 1) - fst(m - 1, n - 1) % 100003)) % 100003);
    return 0;
}

结果5$$AC5$$WA

想知道这是什么原理,有没有更高效的做法

以及希望有神犇能给出比较好的讲解modmod 的博客

初学,问题可能比较zz,求轻喷qwq

2021/10/2 12:05
加载中...