當計算值有可能超過int最大取值2147483647時,oj題一般會要求取模。(這裏的最大取值基於int爲32位整型)
不妨先定義個mod
//這裏mod取常用的10^9+7
#define mod 1000000007
1、大數相加
#include<iostream>
#include<vector>
using namespace std;
vector<int> vec={1245345534,243,2043253142,954233580};
int qsum(vector<int> vec){ //返回vec中所有元素的和
int sum=0;
for(int i=0;i<vec.size();i++){
sum += vec[i] % mod;
sum = sum % mod;
}
return sum;
}
以下乘法和求冪參考文章:https://blog.csdn.net/u013815546/article/details/51318410
2、大數相乘
int qmul(int x, int y){ //返回x*y模mod後的值。轉化成二進制加法(快速加)
int ret = 0;
while(y){
if(y & 1) //二進制下,若y末尾爲1
ret = (ret + x) % mod; //則加x*1,並將x左移1位。
x = (x<<1) % mod; //若y末尾爲0,則加x*0,並將x左移1位,即直接左移。
y = y>>1; //準備計算y前一位的值
}
return ret;
}
3、大數求冪
int qpow(int a, int n){ //返回a^n模mod後的值。過程和相乘類似
int ret = 1;
while(n){
if(n & 1)
ret = qmul(ret, a);
a = qmul(a, a);
n >>= 1;
}
return ret;
}