@TaoSama
2017-01-23T15:22:59.000000Z
字数 3640
阅读 1560
Learning-ACM
//__gcd(a, b)int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}
int lcm(int a, int b){return a / gcd(a, b) * b;}
//ax+by=gcd(a, b)LL exgcd(LL a, LL b, LL& x, LL& y) {LL d = a;if(!b) x = 1, y = 0;else {d = exgcd(b, a % b, y, x);y = (a / b) * x;}return d;}//求二元一次方程x最小非负解LL solve(LL a, LL b, LL c) {LL x, y, g = exgcd(a, b, x, y);if(c % g) return -1;x *= c / g;x = (x % b + b) % (b / g);return x;}
//O(nloglogn)bool notPrime[C];vector<int> prime;//int p[C / 10], ps;for(int i = 2; i < C; ++i){if(notPrime[i]) continue;prime.push_back(i);for(int j = i + i; j < C; j += i)notPrime[j] = true;}
// O(n)bool notPrime[C];vector<int> prime;for(int i = 2; i < C; ++i){if(!notPrime[i]) prime.push_back(i);for(int j = 0; j < prime.size() && i * prime[j] < C; ++j){notPrime[i * prime[j]] = true;if(i % prime[j] == 0) break;}}
// O(sqrt(n))void factorize(int n){vector<int> factors;for(int i = 2; i * i <= n; ++i) {if(n % i == 0) {factors.push_back(i);while(n % i == 0) n /= i;if(n == 1) break;}}if(n != 1) factors.push_back(n);return factors;}void factorize(int n){vector<int> factors;for(int i = 0; i < primes.size() && primes[i] * primes[i] <= n; ++i){if(n % primes[i] == 0) {factors.push_back(primes[i]);while(n % primes[i] == 0) n /= primes[i];if(n == 1) break;}}if(n != 1) factors.push_back(n);return factors;}
void decomposite(int n){vector<int> divisors;for(int i = 2; i * i <= n; ++i){divisors.push_back(i);if(i * i != n) divisors.push_back(n / i);}return divisors;}vector<int> divisors[N];void init(){for(int i = 2; i < N; ++i){for(int j = i + i; j < N; j += i)divisors[j].push_back(i);}}
逆元详解,点击直达
a * x % m == 1 % m
//MOD必须是素数[1, MOD) 模 MOD的逆元inv[1] = 1;for(int i = 2; i < MOD; ++i)inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
int inv(int a, int m){int x, y, g = exgcd(a, m, x, y);if(g != 1) return -1;return (a + m) % m;}
//O(logn)int quickPow(int x, int n){if(n == 0) return 1;if(n & 1) return x * quickPow(x, n - 1);else {int ret = quick(x, n / 2); // (x^(n/2))^2 = x^nreturn ret * ret;}}//O(logn)int quickPow(int x, int n){int ret = 1;for(; n; n >>= 1){if(n & 1) ret = ret * x;x = x * x;}return ret;}int inv(int x, int m){if(m is not a prime) return -1;return quickPow(x, m - 2);}
int fact[N], invFact[N];void init(){fact[0] = 1 = invFact[0] = 1;for(int i = 1; i < N; ++i) {fact[i] = fact[i - 1] * i % MOD;invFact[i] = inv(fact[i], MOD);}}//n <= MOD, m <= MOD, MOD不是很大int C(int n, int m){return fact[n] * invFact[m] % MOD * invFact[n - m] % MOD;}//m比较小int C(int n, int m){int ret = 1;//C(n,m)=C(n,n-m)m = min(m, n - m);for(int i = 0; i < m; ++i){ret *= (n - i);ret /= (i + 1);}return ret;}int C(int n, int m){int up = 1, dw = 1;//C(n,m)=C(n,n-m)m = min(m, n - m);for(int i = 0; i < m; ++i){up *= (n - i);dw *= (i + 1);}dw = inv(dw, MOD);return up * dw % MOD;}//C(n,m) = C(n-1,m)+C(n-1,m-1)// 1// 1 2 1// 1 3 3 1//n和m都不大int C[N][N];for(int i = 0; i < N; ++i)for(int j = 0; j < N; ++j)if(j == 0 || j == i) C[i][j] = 1;else C[i][j] = C[i - 1][j] + C[i - 1][j - 1];