N^2公式的快速模块
Fast Modulo for N^2 formula
本文关键字:模块 更新时间:2023-10-16
我有一个问题,当我试图分辨出此ecuation时,
(1*1 2*2 ... n*n)%10234573
我在C 中的解决方案,
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
unsigned long long int n, s= 0;
cin >> n;
if (n%10234573 == 0)
{
cout << 0;
}
else
{
cout << n*(n+1)*((2*n+1))/6 % 10234573;
}
return 0;
}
我需要一个更大的数字的解决方案,即10^9 一个快速。
要处理更大的数字问题,我们需要以更有效的方式使用数字10234573
。
我们知道,对于mod
,我们有:
(m*n) mod x = ((m mod x)*(n mod x)) mod x
在我们的计算中使用上述公式:
n*(n+1)*((2*n+1))/6 % 10234573
我们需要摆脱dividing by 6
。
我们知道要将数字除以6,我们需要将其分为2和3。
。所以我们有
unsigned long long int mod = 10234573;
unsigned long long int data[3] = {n, n + 1, 2*n + 1};
bool dividedByTwo = false;
bool dividedByThree = false;
for(int i = 0; i < 3; i++){
if(data[i] % 2 == 0 && !dividedByTwo){
data[i]/=2;
dividedByTwo = true;
}
if(data[i] % 3 == 0 && !dividedByThree){
data[i]/=3;
dividedByThree = true;
}
}
//Finally, applying mod to our formula
cout<< ((((data[0]%mod)*(data[1]%mod))%mod)*(data[2]%mod))%mod;
您应该在乘法上使用模量的分布属性,因此您不会溢出。
(ab) % p = ((a%p) (b%p)) %p
对于3个数字,您得到(使用上述公式)
(abc) % p = ((ab) c) % p = ((((a%p) (b%p)) %p) (c%p)) %p
因此,不要先进行3个数字的乘法,然后是模量,而是取每个数字的模量,然后乘以乘法,然后在末端再次取模。
相关文章:
- 尝试导入pybind-opencv模块时出现libgtk错误
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 内联如何影响模块接口中的成员函数
- C++返回 Numpy 数组的 Python 扩展模块
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何从线程中的不同模块调用函数?
- 如何使用 soong 命名空间来有条件地编译模块
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- CMake - 模块 + 库混淆
- 特征 LLT 模块给出不正确的结果?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 python 模块中导入子模块时PyImport_Import失败
- 将 PCL 链接到 Cython C++ 模块
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 电源功能模块化操作
- 如何告诉本机节点模块所需的dll存储在哪里?
- 如何为模块化应用程序实现C++插件系统
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- Arduino 模块化编程与全局和设置