取模运算性质

前言

取模运算(C++中用符号%表示)是求两个数相除的余数。其概念与取余操作类似,又不完全相同。

一.运算定义

假设有整数a,b,在C++中,对于a%b:

1.取a,b绝对值进行运算取余。

2.运算结果符号与a相同。

二.基本性质

作为一种运算,与加减乘除类似,也有交换律,结合律,分配律。

1.交换律

(a+b)%p=(b+a)%p

(a×b)%p=(b×a)%p

2.结合律

((a+b)%p+c)%p=((a+(b+c)%p))%p

((a×b)%p×c)%p=((a×(b×c)%p))%p

3.分配率

比较坑的就是当%p移入到括号以内后,外部的%p仍然需要保留。

(a+b)%p=(a%p+b%p)%p

(ab)%p=(a%pb%p)%p

(a×b)%p=(a%p×b%p)%p

ab%p=((a%p)b%p)%p

三.应用

求解a×bmodp

快速幂的代码如下

    int a, b, p;
    cin >> a >> b >> p;
    int res = 1 % p;
    while (b) {
        if (b & 1) res = (long long)res * a % p;
        a = (long long)a * a % p;
        b >>= 1;
    }
    cout << res << endl;

我们由快速幂的计算原理,可知a×b可拆成a×ck12k1+a×ck22k2+...+a×c020的迭代形式来计算。

根据以上的加法分配率,a×b%p,则可以改写成(a×ck12k1%p+a×ck22k2%p+...+a×c020%p)%p,因此在快速幂的代码中可以用a = (long long)a * a % p;res = (long long)res * a % p;进行表示。

四. 后记

因为在做题时因为概念理解不透彻,备受折磨,因此进行整理。

posted @   荆山璆  阅读(814)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示