赞
踩
输入 a,b
,求 Cba
的值。
注意结果可能很大,需要使用高精度计算。
输入格式
共一行,包含两个整数 a
和 b
。
输出格式
共一行,输出 Cba
的值。
数据范围
1≤b≤a≤5000
输入样例:
5 3
输出样例:
10

#include <iostream> #include <algorithm> #include <vector> using namespace std; const int N = 5010; int primes[N], cnt; int sum[N]; bool st[N]; void get_primes(int a) //模版,求质数 { for(int i = 2; i <= a; i ++ ) { if(!st[i]) primes[cnt ++ ] = i; for(int j = 0; primes[j] <= a / i; j ++ ) { st[primes[j] * i] = true; if(i % primes[j] == 0) break; } } } int get(int a, int p) //辅助函数,求a!的p的次数 { int res = 0; while(a) { res += a / p; //通过不断地将a除以质数 p,将商再除以p //以此类推,累加每一步的商,即可得到a!中质数p的指数 a /= p; } return res; } vector<int> mul(vector<int> a, int b) { vector<int> res; int t = 0; for(int i = 0; i < a.size(); i ++ ) { t += a[i] * b; res.push_back(t % 10); t /= 10; } while(t) { res.push_back(t % 10); t /= 10; } return res; } int main () { int a, b; cin >> a >> b; get_primes(a); for(int i = 0; i < cnt; i ++ ) { int p = primes[i]; //sum[i]存的是组合数对于第i个质数的次数 sum[i] = get(a, p) - get(b, p) - get(a - b, p); } vector<int> res; res.push_back(1); for(int i = 0; i < cnt; i ++ ) for(int j = 0; j < sum[i]; j ++ ) res = mul(res, primes[i]); for(int i = res.size() - 1; i >= 0; i -- ) cout<<res[i]; puts(""); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。