vijosP1137 组合数
【思路】
唯一分解定理。
简化式子为 : C = (n*…*m) / (n-m)!。
题目要求C质因子的数目,在质因子表上进行加减操作即数的乘除操作。
步骤:
1、 构建素数表,注意不要越界。
2、 构造e数组。
3、 累计ans
【代码】
1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 #include<cmath> 5 using namespace std; 6 7 const int maxn = 100100; 8 9 int e[maxn]; 10 int n,m,ans; 11 vector<int> primes; 12 13 void get_primes(int n) { 14 bool su[maxn]; memset(su,true,sizeof(su)); 15 for(int i=2;i<=n;i++) if(su[i]) { 16 primes.push_back(i); 17 if(i<=sqrt(n)) for(int j=i*i;j<=n;j+=i) su[j]=false; 18 //i<=sqrt(n) 否则RE 19 } 20 } 21 22 void calc(int x,int d) { 23 for(int i=0;i<primes.size();i++) { 24 while(x%primes[i]==0) { 25 e[i] += d; 26 x /= primes[i]; 27 } 28 if(x==1) break; 29 } 30 } 31 32 int main() { 33 cin>>n>>m; 34 35 get_primes(n); 36 37 for(int i=m+1;i<=n;i++) calc(i,1); 38 for(int i=2;i<=n-m;i++) calc(i,-1); 39 40 for(int i=0;i<primes.size();i++) ans += e[i]? 1:0; 41 cout<<ans; 42 return 0; 43 }