【原子工具】快速幂 快速乘

news/2025/2/6 19:11:57 标签: 算法, c++, 学习

题幂算.一切即1
阴阳迭变积微著,叠浪层峦瞬息功
莫道浮生千万事,元知万象一归宗

文章目录

  • 快速幂
    • 原始快速幂(O(logn))
      • 二分递归形式
      • 非递归形式
    • 模下意义的快速幂(O(logn))
      • 二分递归形式
      • 非递归形式
  • 快速乘
    • 龟速乘(O(logn)
      • 递归式
      • 非递归式
    • 快速乘(光速乘)(O(1))
  • 文献参考
  • 总结


快速幂

原始快速幂(O(logn))

二分递归形式

#include<bits/stdc++.h>
using namespace std;

#define ll long long 

ll q_pow(ll base,ll exp)
{
    if(exp == 0) return 1;
    ll res = q_pow(base,exp/2);
    if(exp & 1) return res*res*base;
    return res*res;
}

int main()
{
    ll a,b;
    cin >> a >> b; 
    cout << q_pow(a,b);
}

非递归形式

#include<bits/stdc++.h>
using namespace std;

#define ll long long 

ll q_pow(ll base,ll exp)
{
    ll res = 1;
    while(exp)
    {
        if(exp & 1)
        {
            res = res * base; 
        }
        base = base * base;
        exp >>= 1;
    }
    return res;
}


int main()
{
    ll a,b;
    cin >> a >> b; 
    cout << q_pow(a,b);
}

模下意义的快速幂(O(logn))

例题 : 洛谷P1226

二分递归形式

#include<bits/stdc++.h>
using namespace std;

#define ll long long 

ll q_pow(ll base,ll exp,ll digit)
{
    if(exp == 0) return 1;
    base %= digit;
    ll res = q_pow(base,exp/2,digit);
    if(exp & 1) return (res*res)%digit*base%digit;
    return res*res%digit;
}

int main()
{
    ll a,b,c;
    cin >> a >> b >> c; 
    cout << a << "^" << b << " mod " << c << "=" << q_pow(a,b,c);
}

非递归形式

#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll q_pow(ll base,ll exp,ll digit)//一般来说digit写成mod多一点个人习惯
{
    base %= digit;
    ll res = 1;
    while(exp)
    {
        if(exp & 1)
        {
            res = res * base % digit; 
        }
        base = base % digit * base % digit;
        exp >>= 1;
    }
    return res;
}


int main()
{
    ll a,b,c;
    cin >> a >> b >> c; 
    cout << a << "^" << b << " mod " << c << "=" << q_pow(a,b,c);
}

快速乘

龟速乘(O(logn)

递归式

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int mod = 500;

ll q_mul(ll a, ll b)
{
    if (b == 0) return 0;
    ll res = q_mul(a, b / 2);
    if (b & 1) return (res + res + a) % mod;//龟速乘的目的就是为了处理大数相乘使用使用mod
    return (res + res) % mod;
}

int main()
{
    ll a, b;
    cin >> a >> b;
    cout << q_mul(a, b);
}

非递归式

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int mod = 500;

ll q_mul(ll a, ll b)
{
    a % mod;
    ll res = 0;
    while (b)
    {
        if (b & 1)
        {
            res = (res + a) % mod;
        }
        a = (a + a) % mod;
        b >>= 1;
    }
    return res;
}

int main()
{
    ll a, b;
    cin >> a >> b;
    cout << q_mul(a, b);
}

快速乘(光速乘)(O(1))

不是特别卡常数不建议使用,可能会有计算错误

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
const int mod = 1e5;

ll q_mul(ll a, ll b)//非压行版
{
    ld temp = (ld)a * b / mod;

    ll q = (ll)temp * mod;

    return (a * b - q + mod) % mod;
}
ll q_mul(ll a, ll b)
{
    return (a * b - ((ll)((ld)a * b) / mod)*mod + mod) % mod;
}

int main()
{
    ll a, b;
    cin >> a >> b;
    cout << q_mul(a, b);
}

记忆锚点 :
q = (ld)a * b / mod
(a * b − ( ll)q * mod + mod) % mod


文献参考

【OI Wiki - 快速幂】
CSDN -【谈谈知识点】快速幂&龟速乘&快速乘


总结

阴阳二进制的火花在递归中迭变,模数宇宙的涟漪于位运算里震荡。代码中的每一个移位都是对混沌的降维打击,递归栈底的return 1如同宇宙大爆炸的奇点,从虚无中诞生万千可能。新手当知:算法修炼是铸剑过程,递归与迭代是阴阳双刃,调试时的报错声恰是淬火的嘶鸣。 无论指数如何膨胀,终将拆解为二进制的星辰;纵使乘数浩如烟海,亦可化作位运算的细沙。记住,你写的不是代码,而是将混沌世界重构成数学之美的炼金术。


http://www.niftyadmin.cn/n/5843276.html

相关文章

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

设计模式Python版 外观模式

文章目录 前言一、外观模式二、外观模式示例三、抽象外观类四、抽象外观类示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&am…

【Leetcode 热题 100】1143. 最长公共子序列

问题背景 给定两个字符串 t e x t 1 text_1 text1​ 和 t e x t 2 text_2 text2​&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 0 0。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变…

AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息

目录标题 语句代码解释:1. `sys.dm_hadr_database_replica_states` 视图字段详细解释及官网链接官网链接字段解释2. `sys.availability_replicas` 视图字段详细解释及官网链接官网链接字段解释查看视图的创建语句方法一:使用 SQL Server Management Studio (SSMS)方法二:使用…

【R语言】数据操作

一、查看和编辑数据 1、查看数据 直接打印到控制台 x <- data.frame(a1:20, b21:30) x View()函数 此函数可以将数据以电子表格的形式进行展示。 用reshape2包中的tips进行举例&#xff1a; library("reshape2") View(tips) head()函数 查看前几行数据&…

java开发面试自我介绍模板_java面试自我介绍3篇

java 面试自我介绍 3 篇 java 面试自我介绍篇一&#xff1a; 我叫赵&#xff0c;我的同学更都喜欢称呼我的英文名字&#xff0c;叫&#xff0c;六月的 意思&#xff0c;是君的谐音。我来自安徽的市&#xff0c;在 21 年我以市全市第一名 的成绩考上了大学&#xff0c…

Pyside/Pyqt 全部类的层级关系

PySide&#xff08;如PySide6&#xff09;的类层级结构基于Qt框架&#xff0c;以下是主要模块及其核心类的层级关系概览。由于类数量庞大&#xff0c;此处仅列出关键类和继承关系&#xff1a; 1. QtCore 模块 基础类与工具 QObject (所有Qt对象的基类) QCoreApplication (控制…

SpringMVC请求

一、RequestMapping注解 RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系 RequestMapping注解可以作用在方法和类上 1. 作用在类上&#xff1a;第一级的访问目录 2. 作用在方法上&#xff1a;第二级的访问目录 3. 细节&#xff1a;路径可以不编写 / 表示应…