ACwing90 64位整数乘法 大数乘法取模

网址:https://www.acwing.com/problem/content/92/

题解:

大数乘法取模模板。

AC代码:

#include <bits/stdc++.h>
using namespace std;
long long add(long long a, long long b, long long p)
{
	long long res = 0;
	while (b)
	{
		if (b & 1)
			res = (res + a) % p;
		a = (a * 2) % p;
		b >>= 1;
	}
	return res % p;
}
int main()
{
	long long a, b, p;
	scanf("%lld%lld%lld", &a, &b, &p);
	printf("%lld\n", add(a, b, p));
	return 0;
}

  

原文地址:https://www.cnblogs.com/Aya-Uchida/p/11470212.html

时间: 2024-10-15 03:16:37

ACwing90 64位整数乘法 大数乘法取模的相关文章

[位运算] 64位整数乘法(mod 一个数)

64位整数乘法 在部分题目中可能涉及到长整数(long long)的相关计算,可当我们需要将两个长整数相乘时有可能出现溢出的情况,这时候通常需要进行高精度计算,可如果我们需要将两个长整数相乘并 mod 一个数时高精度计算也就不太方便了,这时我们需要一个优秀的算法让我们快速的计算出类似 a×b mod c 的数值 [算法描述(1)] 我们用快速幂的思想,将b用二进制表示 b=ck-12k-1+ck-22k-2+-+c020 那么: a×b=a×(ck-12k-1+ck-22k-2+-+c020)=

第三次作业 阅读程序有符号 64 位整数数据类型

这是一个C++程序,,,额,看着头痛(额,说实话,由于中间有一年多没上过学,再加上最开始也学的很一般,读起来累)不过什么东西慢慢来总能越来越好 问题一: 答: 首先Int64 i 是表示有符号 64 位整数数据类型,这个数i范围很大 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )....我表示大学这么几年,程序里面遇见这种情况的次数少 由此可见学校的东西和实际毕竟还是差距很大 然后看for循环 fo

大数幂取模

//大数幂取模 #include "iostream" using namespace std; //(a^b) % m int mod(int a,int b,int m){ int result = 1; for(int i=0;i<b;i++) { result = (result*a) %m; } return result; } int main(){ cout << mod(2,4,5) << endl; }

【例题】64位整数乘法

题目地址 方法一 (口胡一下就好了啊) 快速幂思想的灵活运用. 把 \(b\) 用二进制表示 , 设 \(b\) 在二进制下有 \(k\) 位 , \(c_i\) 表示 \(b\) 在二进制下的第 \(i\) 位 \[b=c_{k-1}*2^{k-1}+c_{k-2}*2^{k-2}+...+c_{0}*2^{0}\] 根据加法原理,\(a*b\) 相当于 \(b\) 个 \(a\) 相加,现在把 \(b\) 用二进制表示,那么就有: \[a*b=c_{k-1}*2^{k-1}*a+c_{k-2

16位整数,32位整数,64位整数

首先解释16位整数:所谓16位整数就是16个二进制位(16#7FFF)而对应的最大整数为32767:PLC中是用二进制的补码来表示有符号数的,定义最高位为符号位:当最高位位0时为正:最高位为1时为负;所以经过换算就是-701:(补码是正数先求反码(0变1:1变0)然后加1): 以次内推,32位,64位也是如此.

windows 64位整数

#include <iostream> #include <ctime> using namespace std; int main() { cout << sizeof(long) << endl;//4 cout << sizeof(long long) << endl;//8 cout << sizeof(__int64) << endl;//8 //time_t在64位上为__time64_t,为__i

UVa 11582 Colossal Fibonacci Numbers! 【大数幂取模】

题目链接:Uva 11582 [vjudge] 题意 输入两个非负整数a.b和正整数n(0<=a,b<=2^64,1<=n<=1000),让你计算f(a^b)对n取模的值,当中f(0) = 0,f(1) =  1.且对随意非负整数i.f(i+2)= f(i+1)+f(i). 分析 全部的计算都是对n取模.设F(i) =f(i)mod n, 非常easy发现,F(x)是具有周期性的,由于对N取模的值最多也就N个,当二元组(F(i-1),F(i))反复的时候.整个序列也就反复了.周期i

51NOD 1116 K进制下的大数(字符串取模 + 枚举)

传送门 1116 K进制下的大数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数.现在由你来求出这个最小的进制K. 例如:给出的数是A1A,有A则最少也是11进制,然后发现A1A在22进制下等于4872,4872 mod 21 = 0,并且22是最小的,因此输出k = 22(大数的表示中A对应10,Z对应35). Input 输入大数对应的字符串S

EOJ3134. 短信激活码(大数幂取模)

题面 输入只有5位,所以转化为long long类型用快速幂取模 前面补0的写法printf("%05lld\n",ans);如果ans不足5位会在前面补0 1 #include<bits/stdc++.h> 2 using namespace std; 3 long long mod_exp(long long a, long long b, long long c) //快速幂取余a^b%c 4 { 5 long long res, t; 6 res = 1 % c;