一.取模运算
取模(取余)运算法则:
1. (a+b)%p=(a%p+b%p)%p;
2.(a-b)%p=(a%p-b%p)%p;
3.(a*b)%p=(a%p * b%p)%p;
4.(a^b)%p=( (a%p)^b )%p;
5. ( (a+b)%p+c )%p=( a+(b+c)%p )%p;
6.( a*(b*c)%p )%p =( c*(a*b)%p )%p;
7.( (a+b)%p*c )%p= ( (a*c)%p + (b*c)%p )%p;
几条重要性质:
1.a≡b%p,呢么对于任意的c都有 (a+c)≡(b+c)%p, (a*c)≡(b*c)%p;
2.a≡b%p,c≡d%p呢么 (a+c)≡(b+d)%p,(a*c)≡(b*d)%p;
关于取余运算(rem)与取模运算(mod)的区别:
网上资料显示是他们的运算方式导致了有负数时出现不同结果
rem(a,b)=a-b*fix(a/b),是采用了fix()函数 向0方向取整(并且结果的正负一定与被除数 a 相同)
mod(a,b)=a-b*floor(a/b),采用了floor()函数 向负无穷方向取整 (并且结果的正负一定与除数 b 相同)
示例:mod(4,-3)= (4-(-3)*(-1.3) )= - 2 ; rem(4,-3)= (4-(-3)(-1.3) )= + 1; (我的DEV5.11采用的是rem)
快速幂,快速乘,gcd,最小公倍数模板代码:
#include<iostream> #include<algorithm> using namespace std; /* 快速幂 ,快速乘,gcd,取模(取余)预算法则与取余预算区别*/ int main() { int a,b,c,d; long long sum1=1,sum2=1; cin>>a>>b>>c>>d; /*快速幂*/ while(b) { if(b%2==1) sum1*=a; b/=2; a*=a; } /*快速幂*/ cout<<sum1<<endl<<endl; while(d) { if(d&1) sum2*=c; c*=c; d>>=1; } cout<<sum2<<endl<<endl; /*快速乘*/ cin>>a>>b; long long res=0; while(b!=0) { if(b%2==1) res+=a; a+=a; b/=2; } cout<<res<<endl<<endl; /*快速乘 */ while(b>0) { if (b&1!=0) res+=a; a+=a; b>>=1; } cout<<res<<endl<<endl; /* gcd */ int t,product; cin>>a>>b; product=a*b; while(b) { t=b; b=a%b; a=t; } cout<<a<<" "; cout<<"最小公倍数乘积除以最大公约数" <<product/a<<endl<<endl; cin>>a>>b; /*百度大神代码*/ while(b^=a^=b^=a%=b); cout<<a<<endl<<endl; return 0; }