我正在嘗試為自然數的平方和撰寫一個代碼,但是使用 mod 它給出了錯誤的答案。這里的正確方法是什么?
#include <bits/stdc .h>
using namespace std;
#define mod 1000000007
int main()
{
int N;
cin>>N;
cout<< (((N) * (N 1) * (2*N 1))/6)%mod;
return 0;
}
uj5u.com熱心網友回復:
(N) * (N 1) * (2*N 1)可以,即使N小于1000000007,也太大了。即最多 2000000039000000253000000546,這是一個 91 位數字。int您的系統不太可能包含如此大的數字。
與此類問題一樣,解決方法是:
- 對中間產品使用更大的整數型別,以及
- 對中間產品應用減模,而不僅僅是在最后。
僅使用其中之一是不夠的。
由于較早應用模約簡,除以 6 將無法與正常除法一起使用,它必須是乘以 6 mod 1000000007 的模乘倒數,即 166666668。
示例代碼:
mod_mul(mod_mul(mod_mul(N, N 1, mod), mod_mul(2, N, mod) 1, mod), inv6, mod)
使用 的一些合適的定義mod_mul,可以通過使用long long或類似的型別來避免溢位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362839.html
上一篇:如何將物件從頭到尾移動半圈?
