Vijos——P 1137 组合数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vijos——P 1137 组合数相关的知识,希望对你有一定的参考价值。

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 组合数的主要内容,如果未能解决你的问题,请参考以下文章

组合数问题 vijos2006 NOIP2016 D2T1 杨辉三角 排列组合 前缀和

Vijos 连续数之和 (组合数学)

Vijos P1785 同学排序模拟

如何组合绑定片段而不将它们包装在 XML 文字中

二分高精度Vijos P1472 教主的集合序列

洛谷—— P1036 选数 || Vijos——选数