首页 > 编程语言 > 快速幂c++

快速幂c++

时间:2023-01-26 22:12:11浏览次数:40  
标签:16 32 c++ 64 long 256 128 快速

是求(a^b) mod p

如果用暴力解法 O(b)

点击查看TLE代码c++
#include<iostream>
using namespace std;
int main()
{
    int a,b,p;
    long long res=1;
    cin>>a>>b>>p;
    while(b--)
        res = res * a %p;
    cout<<res<<endl;
}

所以就要用快速幂解法

如果b是二的幂;
就只需计算所有二的幂

点击查看样例b=128
(a^1) * (a^1) = (a^2)
(a^2) * (a^2) = (a^4)
(a^4) * (a^4) = (a^8)
(a^8) * (a^8) = (a^16)
(a^16) * (a^16) = (a^32)
(a^32) * (a^32) = (a^64)
(a^64) * (a^64) = (a^128)

只需计算7次

点击查看样例b=4096
(a^1) * (a^1) = (a^2)
(a^2) * (a^2) = (a^4)
(a^4) * (a^4) = (a^8)
(a^8) * (a^8) = (a^16)
(a^16) * (a^16) = (a^32)
(a^32) * (a^32) = (a^64)
(a^64) * (a^64) = (a^128)
(a^128) * (a^128) = (a^256)
(a^256) * (a^256) = (a^512)
(a^512) * (a^512) = (a^1024)
(a^1024) * (a^1024) = (a^2048)
(a^2048) * (a^2048) = (a^4096)

只需计算12次

如果b不是二的幂

就只需在b是二的幂的基础上新增一点点

步骤一

先把它看成二进制

步骤二

多乘二进制的一所代表的数

点击查看样例b=666

二进制是1010011010

(a^1)                           #0 
(a^1) * (a^1) = (a^2)           #1 需多乘
(a^2) * (a^2) = (a^4)           #0 
(a^4) * (a^4) = (a^8)           #1 需多乘
(a^8) * (a^8) = (a^16)          #1 需多乘
(a^16) * (a^16) = (a^32)        #0
(a^32) * (a^32) = (a^64)        #0
(a^64) * (a^64) = (a^128)       #1 需多乘
(a^128) * (a^128) = (a^256)     #0
(a^256) * (a^256) = (a^512)     #1 需多乘

只需计算7次

以下是c++代码

long long counting(long long multiplier,int frequency,int mod){
	int result = 1;
	while(frequency){
		if(frequency & 1){
			res = (LL)result * multiplier % mod;
			frequency >>= 1;
			multiplier = (LL)multiplier * multiplier % mod;
		}
	}
	return result;
}

标签:16,32,c++,64,long,256,128,快速
From: https://www.cnblogs.com/wqzgg/p/17066800.html

相关文章

  • C++可变参数模板
    template<class...T>voidf(T...args){cout<<sizeof...(args)<<endl;}sizeof...一整个是运算符可以通过递归或逗号表达式方式展开该参数包可以使用这种可......
  • 通过脚本实现Java程序在window系统中的快速启动和快速停止
    本文的目的是通过脚本实现Java程序在window系统中的快速启动和快速停止启动java程序前台方式启动java-jarxxx.jar登录后复制通过这种方式启动的缺点是需要保持cmd窗......
  • 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成
    【对象的初始化和清理】生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......
  • C++中的指针和引用
    指针在C++,指针本质上也是一个对象,它存储的是对象的地址,而非值本身。是一个有趣且功能强大的特性。指针的定义指针的定义,使用"*"进行修饰一个变量。int*p1,*p2如上,定......
  • C/C++程序是怎么运行的?
    一个C/C++程序运行经历的过程:预处理、编译、汇编、链接、执行。【注】其中源程序、修改了的源程序和汇编程序都是文本文件,而可重定位目标程序和可执行目标程序都是二进制......
  • c++ 数组
              ......
  • 力扣只出现一次的数字系列总结(C++)
    tags:LeetCodeC++DSA写在前面最近用到的异或运算越来越多了,而其中又以只出现一次的数字为经典题型,下面总结总结一下只出现一次的数字系列.代码均为C++.前置知识逻辑......
  • C++语言课程设计任务书[2023-01-26]
    C++语言课程设计任务书[2023-01-26]课程设计要求及评分标准:一、教学目标和基本要求本课程全面系统的学习面向对象程序设计的基本概念,基本语法和编程方法。正确理解掌握C......
  • C/C++歌曲信息管理系统[2023-01-26]
    C/C++歌曲信息管理系统[2023-01-26]任务描述(1)设计一个对歌曲信息进行查询、编辑、添加、删除等操作的管理程序。(2)歌曲信息包括歌曲名、词作者、曲作者、演唱者、发......
  • C/C++仲恺农业工程学院计算机系图书管理系统
    C/C++仲恺农业工程学院计算机系图书管理系统对仲恺农业工程学院计算机系的图书进行管理,包括录入、删除、查找、修改、排序等功能。图书应该包括类别、编号、ISBN号、作者......