码迷,mamicode.com
首页 > 其他好文 > 详细

Vijos——P 1137 组合数

时间:2017-11-19 17:29:57      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:https   cst   for   oid   prime   upd   amp   tps   char   

https://vijos.org/p/1137

描述

组合公式 C=N!/(M!*(N-M)!). 问题是求 C 中不同的质因子的个数
例如 N=7, M=4. C=7!/(3!*4!)=5040/(6*24)=35=5*7. 则不同的质因子的个数为2 (分别是5,7)。

格式

输入格式

输入N,M

输出格式

输出一个整数

样例1

样例输入1

7 4

样例输出1

2

限制

 

质因数分解。。

 1 #include <cstdio>
 2 
 3 inline void read(int &x)
 4 {
 5     x=0; register char ch=getchar();
 6     for(; ch>9||ch<0; ) ch=getchar();
 7     for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0;
 8 }
 9 
10 const int N(100521);
11 int n,m,pri[N],cnt;
12 bool no_pri[N];
13 
14 inline void Get_Prime(int lim)
15 {
16     no_pri[1]=1;
17     for(int i=2; i<=lim; ++i)
18     {
19         if(!no_pri[i]) pri[++cnt]=i;
20         for(int j=1; j<=cnt; ++j)
21         {
22             if(pri[j]*i>lim) break;
23             no_pri[pri[j]*i]=true;
24             if(i%pri[j]==0) break;
25         }
26     }
27 }
28 
29 int _if[N],ans;
30 inline void Update(int x,int op)
31 {
32     for(int i=1; i<=cnt; ++i)
33     {
34         if(x%pri[i]) continue;
35         x/=pri[i]; _if[i]+=op;
36         for(; x%pri[i]==0; )
37             _if[i]+=op,x/=pri[i];
38     }
39 }
40 
41 int Presist()
42 {
43     read(n),read(m);
44     Get_Prime(n+1);
45     for(int i=m+1; i<=n; ++i) Update(i, 1);
46     for(int i=2; i<=n-m; ++i) Update(i,-1);
47     for(int i=1; i<=cnt; ++i) ans+=(_if[i]>0);
48     printf("%d\n",ans);
49     return 0;
50 }
51 
52 int Aptal=Presist();
53 int main(int argc,char**argv){;}

 

Vijos——P 1137 组合数

标签:https   cst   for   oid   prime   upd   amp   tps   char   

原文地址:http://www.cnblogs.com/Shy-key/p/7860250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!