首页 > 其他分享 >快速幂+大整数乘法

快速幂+大整数乘法

时间:2023-04-28 09:35:22浏览次数:46  
标签:le res LL res1 整数 long 乘法 快速 mod

(快速幂+位运算)

\(0\le a,b\le 10^9\\ 0\leq p \leq 10^9\)
快速幂:
(1)取模运算法则

  • (a + b) % p = (a % p + b % p) % p
  • (a - b) % p = (a % p - b % p ) % p
  • (a * b) % p = (a % p * b % p) % p

(2)快速幂可以在O(logk)内算出\(a^k\)mod p的值
先处理出:
\(a^{2^0} \ mod \ p\)
\(a^{2^1} \ mod \ p\)
\(a^{2^2} \ mod \ p\)
\(a^{2^3} \ mod \ p\)
\(a^{2^4} \ mod \ p\)

\(a^{2^{logk}} \mod \ p\)
只需要把k处理成二进制就可以了
那如何进行预处理呢?
\(a^{2^0}\\ {a^{2^1}}^2 = a^{2 ^ 2}\\ 以此类推\)
全开LL避免溢出

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
LL a,b,p;


LL qmi(LL &a,LL &b, LL &q)
{
    LL res = 1 % q;
    while(b)
    {
        if(b & 1) res = res * a % q;
        a = a * a % q;
        b >>= 1;
    }
     return res;
    
}

int main()
{
    cin >> a >> b >>p;
    cout << qmi(a,b,p)<<endl;
    
    return 0;
}

例:
求 a * b % p 的值
\(1\le a,b,p \le 10^{18}\)
Py自带高精度,所以虐杀
a = input()
b = input()
p = input()
print(a * b % p)
C++代码可以用位运算来做
可以参考上述快速幂的思想,a * b = a + a + a + a......+ a
a 2a 4a 8a 16a .....

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
LL res(LL &a, LL &b, LL &p)
{
    LL res1 = 0;
    while(b)
        {
            if(b & 1) res1 = (res1 + a) % p;
            a = a * 2 % p;
            b >>= 1;
        }
    return res1;
}

int main()
{
    LL a, b ,p;
    cin >> a >> b >> p;
    cout << res(a, b, p)<<endl;
    return 0;
}

上一章:递归实现三类枚举

标签:le,res,LL,res1,整数,long,乘法,快速,mod
From: https://www.cnblogs.com/lyz103/p/17360949.html

相关文章

  • 快速上手Linux核心命令(九):文件备份与压缩
    目录tar打包备份gzip压缩或解压文件zip打包和压缩文件unzip解压zip文件scp远程文件复制rsync文件同步工具这期呢主要说一说Linux中文件备份与压缩命令,一共6个命令。这6个命令都是平常工作中非常非常常用的。tar打包备份1、简介tar可以将多个文件压缩打包、压缩。是......
  • Jest快速使用指南
    1.引言写了几个函数,怎么知道写得对不对呢?可以通过测试函数,当然开发中测试的意义不只是这个Jest是常用的JavaScript测试框架官网为:Jest·......
  • 火山引擎 DataTester 智能发布平台:智能化 A/B 实验,助力产品快速迭代
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在互联网竞争炙热的红海时代,精益开发高效迭代越来越成为成为产品竞争的利器。产品迭代过程中,如何保障高效的功能迭代安全上线,如何快速实现不同人群的精细化运营,成为了产研人员的新挑战,为了帮......
  • 高精度乘一位整数
    求高精度数的n倍【问题描述】定义一个高精度数a,输出a的n(0<=n<=9)倍的值。a的长度不超过200.【输入输出描述】输入:两行,第一行为高精度数a,第二行为倍数n;输出:a的n倍的值【样例输入】122344445556667773【样例输出】36703333667000331#include<iost......
  • 矩阵乘法的指令集加速例子
    这里就不介绍基本概念了,直接给代码和对比结果。分别是普通C++代码,SSE加速代码和OpenCV代码。代码基于VS2017、OpenCV430和Qt5.9。CPU型号是IntelCorei5-7400。Matmul1(constMat&a,constMat&b){ASSERT(a.cols==b.rows);#defineCOUNTa.colsMatc=Mat::z......
  • .Net8的快速JIT,分层编译,R2R的设置
    前言本篇通过一些简单的JIT设置,比如快速JIT,适用于循环的快速JIT,分层编译,R2R等核心内容设置,快速进入.Net8核心区域。概括1.快速JIT什么是快速JIT,顾名思义,被Rosyln编译的.Net源码进行快速的机器码编译。这么做的目的是,提高编译的速度,但是降低了代码的性能和整体质量。适用于大......
  • python数据可视化神库:Matplotlib快速入门
    Matplotlib易于使用,是Python中了不起的可视化库。它建立在NumPy数组的基础上,旨在与更广泛的SciPy堆栈一起工作,并由几个图组成:线图、条形图、散点图、直方图等。快速入门importmatplotlib.pyplotasplt#initializingthedatax=[10,20,30,40]y=[20,30,40,50]......
  • 如何在博客园快速上传Markdown文件
    如何在博客园快速上传Markdown文件1、首先拥有书写MarkDown文件的工具:例如:Typora(博主推荐使用)MarkdownPadBookPad小书匠VisualStudioCode等等下载Typora的地址(自取):MarkDown软件https://www.aliyundrive.com/s/vnBazjXLdkr提取码:tx58点击链接保存,或者复制本段内......
  • PTA1006 换个格式输出整数(C++)
    一、问题描述:让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过3位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测......
  • AcWing 242. 一个简单的整数问题 / 树状数组区间修改区间查询模板题
    AcWing242.一个简单的整数问题//实例化是抽象的天敌,是抽象的克星//通过公式sn=(i从1~n求积)di*(1+n)-(i从1~n求积)i*di//来计算前缀和,又(i从1~n求积)i*di不能由(i从1~n求积)di*(1+n)推出//所以除了维护d数组,还需维护......