同余与模算术

(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值