同余与模算术
(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,才有唯一解。否则无解