__int64 mod(__int64 a, __int64 b, __int64 n)
{
__int64 arr[500],z = -1,y;
for( ; b != 1 ; b >>= 1)//分解b为二进制,记录下分解成的位数z构造栈arr
{
z++;
if( b % 2 == 0)
arr[z] = 0;
else
arr[z] = 1;
}
//a %= n如果一开始数很大,先模一次,防止过大,求逆
y = a * a % n;//第一次去模
for(; z > 0; z--)
{
if(arr[z])
y = (y*a%n) * (y*a%n);
else
y = y * y % n;
}
if( arr[0] )
y = (y*a % n);//最后一次取模
return y;
}
幂取模
方法一:
int pow_mod(int a,int b,int m)
{
int ans = 1;
for(int i = 0; i < n; i++)
ans = (int )((long long) ans * n % m);
return ans;
}
方法二:利用分治法使算法更快
int pow_mod(int a, int n,int m)
{
int x = pow_mod(a, n/2 ,m);
long long ans = (long long)x * x % m;
if(n%2 == 1 )
ans *= a%m;
return int(ans);
}