整理一下自己遇到的两种大数取余类型的题目,如果遇到其他类型以后还会接着去补充。
一、A^B mod m
几个基本公式:
A < m,且B是一个较大的数,A^B非常巨大,先求A^B再用m取模是不现实的。利用上面公式,我们可以进行如下代换:
算法:
//计算exp=a^n mod m
//输入:a,n,m
//输出:exp
int exp_mod(int a,int n,int m)
{
int exp,A; //exp表示a^n,A是A_i
exp=1;
A=a%m;
while(n>0)
{
if(n%2 != 0)
exp=(exp*A)%m;
A=(A*A)%m;
n=n/2;
}
return exp;
}
二、A%B
A是一个大数,B是一个int型的整数,求A%B。A可能无法用已知数据类型存储,直接取余很困难。
可以设置变量t从大数第一位向后遍历赋值,如果大于mod就取余更新,最后t的值就是所求答案。
例:
123 % 4 取一个中间变量t=0
1<4 t=1
— 2 t=1*10+2=12>4 t=t%4=0
— 3 t=0+3=3 t=t%4=3
——————– 余数 3
算法:
int MOD(string a,int mod)
{
int len=a.length();
int t=0;
for( int i = 0; i < len; i++ )
{
t*=10;
t+=a[i]-'0';
if( t >= mod )
t=t%mod;
}
return t;
}
参考博客:http://www.cnblogs.com/lsx54321/archive/2012/07/25/2607602.html