c – 两个二项式系数的GCD,模数为10 ^ 9 7
给出0≤k≤n≤500000,0≤l≤m≤500000.
我需要计算GCD(C(n,k),C(m,l))模10 ^ 9 7. 我的尝试: 我考虑过使用fourmula的技巧: 例如,假设l> = k: 反转l!用二进制求幂到10 ^ 9 5很好,但我不知道如何继续. 这(k 1)* … * l部分破坏了一切.如果在乘数之间存在交集,我可以找到一些好处 接下来是什么?使用原生GCD算法保留剩余乘数? 我是正确的吗? 解决方法
有了juvian的建议,这很简单.我怎么没想出分解的想法!
我的C代码如下: #include <iostream> #include <algorithm> #define NMAX 500000 #define MOD 1000000007 using namespace std; long long factorial(long long n) { long long ans = 1; for (int i = 2; i <= n; i++) ans = ans * i % MOD; return ans; } long long binPow(long long num,int p) { if (p == 0) return 1; if (p % 2 == 1) return binPow(num,p - 1) * num % MOD; if (p % 2 == 0) { long long b = binPow(num,p / 2); return b * b % MOD; } } void primesFactorize(long long n,long long primes[]) { for (int d = 2; d * d <= n; d++) while(n % d == 0) { n /= d; primes[d]++; } if (n > 1) primes[n]++; } long long primes1[NMAX]; long long primes2[NMAX]; int main() { long long n,k,m,l; cin >> k >> n >> l >> m; if (k > l) { swap(n,m); swap(k,l); } for (int i = n - k + 1; i <= n; i++) primesFactorize(i,primes1); for (int i = k + 1; i <= l; i++) primesFactorize(i,primes1); for (int i = m - l + 1; i <= m; i++) primesFactorize(i,primes2); for (int i = 2; i <= max(n,m); i++) primes1[i] = min(primes1[i],primes2[i]); long long ans = 1; for (int i = 2; i <= max(n,m); i++) for (int j = 1; j <= primes1[i]; j++) ans = ans * i % MOD; ans = ans * binPow(factorial(l),MOD - 2) % MOD; cout << ans << endl; return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |