(a+b)mod p = (a mod p + b mod p) mod p
(a*b)mod p = ((a mod p) * (b mod p)) mod p
(a-b)mod p = ((a mod p)-(b mod p) + p) mod p
a^b mod p= ((a mod p)^b) mod p
结合率:((a+b) mod p + c) mod p = (a + (b+c) mod p) mod p
((a*b) mod p * c) mod p = (a * (b*c) mod p) mod p
交换率: (a + b) mod p= (b+a) mod p
(a * b) mod p= (b * a) mod p
分配率: ((a +b)mod p * c) mod p= ((a * c) mod p + (b * c) mod p) mod p
重要定理:
若a≡b ( mod p),则对于任意的c,都有(a + c) ≡ (b +c) ( mod p);
若a≡b ( mod p),则对于任意的c,都有(a * c) ≡ (b *c) ( mod p); 若a≡b ( mod p),则对于任意的c,都有ac≡ bc ( mod p);
若a-b=c,则a%c=b%c
大数取模:正整数n和m,n<=10100,m<=109.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
string n;
int ans=0,m;
cin>>n;
cin>>m;
int len=n.length();
for(int i=0; i<len; i++)
ans=(int)(((long long)ans*10+n[i]-'0')%m);
cout<<ans<<endl;
return 0;
}
快速幂取模:
#include <iostream>
using namespace std;
int pow_mod(int a,int n,int m)
{
if(n==0)
return 1;
int x=pow_mod(a,n/2,m);
long long ans=(long long)x*x%m;
if(n%2==1)
ans=ans*a%m;
return (int)ans;
}
int main()
{
int a,n,m;
while(cin>>a>>n>>m)
cout<<pow_mod(a,n,m)<<endl;
return 0;
}