范围是10^18的大模算法
Big mod algorithm for range 10^18?
我必须计算N^X MOD 10^18+7,我的范围是1<=N,X<=10^18。通常的大模算法将无法计算这个。解决这个问题的合适算法是什么我用的是c++。因为范围是10^18,所以10^18+7的最小mod将是10^18,如果是这样,那么编译器将不得不计算10^18*10^18。
有一个不涉及使用二进制的解决方案。平凡解决方案的主要问题是需要计算n*n
。如果n>sqrt(2^63-1)
将溢出int64
数。解决这个问题的方法是用计算n^x%m
的方法来计算n*n%m
。
我的意思是,你必须实现一个定制的模块化乘法,通过只做加法来避免溢出。
在c++中,类似于:
#include <iostream>
using namespace std;
template <typename T>
T mmul(T a, T b, T m) {
a %= m;
T result = 0;
while (b) {
if (b % 2) result = (result + a) % m;
a = (a + a) % m;
b /= 2;
}
return result;
}
template <typename T>
T mpow(T a, T b, T m) {
a %= m;
T result = 1;
while (b) {
if (b % 2) result = mmul(result, a, m);
a = mmul(a, a, m);
b /= 2;
}
return result;
}
int main() {
long long big = 1000000000000000000;
cout << mpow(big+1, big+2, big+7) << endl;
}
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 这个变量在 C++ 中的范围是什么?
- C++ 中的引用范围是什么?
- PTRACE_TRACEME的范围是多少?
- 确定范围是访问虚拟功能的合法方式吗?
- C 中类声明的范围是什么?
- C 中静态声明的结构的范围是什么?
- Winsock中插座对象的范围是什么?
- 默认模板参数的范围是什么?
- 封闭环变量的生存期和范围是什么
- 从 boost::algorithm::join 返回值的范围是什么?
- 一种用于排序和洗牌等值条目的快速算法(最好是STL的)
- 类模板中定义的朋友函数范围定义的范围是什么?
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 尝试将引擎从SDL重写为SFML,sf::RenderWindow的范围是错误的
- 功能范围是什么意思
- 可视化 C++ 宏重定义的范围是什么
- Java中PKCS#5 PBKDF1的算法名称是什么?
- 对一组数字进行排序的最快数据结构(和排序算法)是什么
- 范围是10^18的大模算法