把常用的数学模板放这里免得忘了
素数表
1 int prime[maxn]; 2 void prime() 3 { 4 int i, j; 5 memset(prime, 1, sizeof(prime)); 6 for (i = 2; i < maxn; i++){ 7 if (prime[i]){ 8 for (j = 2; i*j < maxn; j++) 9 prime[i*j] = 0; 10 } 11 } 12 prime[0] = prime[1] = 0; 13 prime[2] = 1; 14 }
组合数
1 int cur[maxn][maxn] = { 1 }; 2 3 //预处理 利用杨辉三角计算组合数 4 void init(){ 5 int i, left, right; 6 for (i = 1; i <= maxn; i++){ 7 cur[i][0] = cur[i][i] = 1; 8 left = 1, right = i - 1; 9 while (left <= right){ 10 cur[i][left] = cur[i - 1][left - 1] + cur[i - 1][left]; 11 cur[i][right--] = cur[i][left++];//组合数性质cur[i][j]=cur[i][i-j]; 12 } 13 } 14 }
高精度幂取模
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int main() 5 { 6 unsigned long long b,c,cur,res,i; 7 string a; 8 while(cin>>a){ 9 cin>>b>>c; 10 for(i=cur=0;a[i]!=‘\0‘;i++){ 11 cur=cur*10+a[i]-‘0‘; 12 cur%=c; 13 } 14 res=1; 15 while(b){ 16 if(b&1) res=res*cur%c; 17 cur=cur*cur%c; 18 b>>=1; 19 } 20 cout<<res<<endl; 21 } 22 return 0; 23 }
模运算法则:
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (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 (4)
推论:
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
费马定理:若p是素数,a是正整数且不能被p整除,则:a^(p-1) mod p = 1 mod p
推论:若p是素数,a是正整数且不能被p整除,则:a^p mod p = a mod p
二分快速幂
1 long pow(int x, unsigned int n){ 2 long p = 1; 3 while (n){ 4 if (n & 1) p *= x; 5 x *= x; 6 n >>= 1; 7 } 8 return p; 9 }
时间: 2024-10-03 20:16:29