数论学习之起步篇(二)

同余与模算术


(a+b)%n = ((a%n)+(b%n))%n
(a-b)%n = ((a%n)-(b%n)+n)%n
ab%n = (long long)(a%n)*(b%n)%n
其中要注意a%n*b%n的值可能超int

10-1 大整数取模
输入正整数n和m,输出n mod m的值。n<=10^100,m<=10^9

将大整数写成“自左向右”的形式:1234%n=(((1*10+2)*10+3)*10+4)%n,然后就可以用之前的公式来处理了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
using namespace std;
int main ()
{
    char n[110];
    int m;
    scanf("%s%d",n,&m);
    int len=strlen(n);
    long long ans=0;
    for (int i=0; i<len; i++)
        ans=(ans*10+n[i]-'0')%m;
    printf("%d\n",ans);
    return 0;
}

10-2 幂取模
输入正整数a、n和m,输出a^n mod m的值。a,n,m <= 10^9

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
using namespace std;
int pow_mod(int a, long long 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) ans=ans*a%m;
    return (int)ans;
}
int main ()
{
    int a,m;
    long long n;
    cin>>a>>n>>m;
    int ans=pow_mod(a,n,m);
    cout<<ans<<endl;
    return 0;
}


10-3 模线性方程
输入正整数a,b,n,解方程ax≡b(mod n)。a,b,n<=10^9
≡代表同余。即ax-b=ny。不难看出这就是一个扩展欧几里得算法

还有就是ax≡1(mod n)的解称为a关于模n的逆元。ax-ny=1, 这代表了gcd(a,n)=1,才有唯一解。否则无解






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值