FZU 1851 组合数

  给你两个数n和m,然后让你求组合数C(n,m)中的质因子的个数。

  这里用到的一个定理:判断阶乘n!中的质因子 i 的个数的方法---f(n!)=n/i+n/i^2+n/i^3+.....n/i^m (i为一个质因子,m是使n/i^m=0的最小值);

  又已知C(n,m)=n!/ ( m!·(n-m)! ) ; 所以需要n!中所有的质因子的个数,然后再减去m! 和 (n-m)! 这些质因子的个数,得到的结果就是该组合数质因子的个数。

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <cstdlib>
 7 #include <cctype>
 8 #include <queue>
 9 #include <stack>
10 #include <map>
11 #include <vector>
12 #include <set>
13 #include <utility>
14 #define ll long long
15 #define inf 0x3f3f3f3f
16 using namespace std;
17
18 const int N=1e6+7;
19 bool book[N];
20 vector<int> prime;
21 void get_prime() //筛法预处理素数表
22 {
23     fill(book,book+N,false);
24     for(int i=2;i<N;i++)
25     {
26         if(!book[i])
27         {
28             prime.push_back(i);
29             for(int j=i+i;j<N;j+=i)
30                book[j]=true;
31         }
32     }
33 }
34 int main()
35 {
36     //freopen("input.txt","r",stdin);
37     get_prime();
38     int n,m;
39     while(scanf("%d%d",&n,&m)&&n&&m)
40     {
41         int res=0;
42         int len=prime.size();
43         for(int i=0;i<len&&prime[i]<=n;i++)
44         {       //分别计算n!、m!、(n-m)! 中含有质因子prime[i]的个数,再把n!的个数减去m!和(n-m)!的个数
45             int tn=n,tm=m,tt=n-m,cnt=0;
46             while(tn)
47             {
48                 cnt+=tn/prime[i];
49                 tn/=prime[i];
50             }
51             while(tm)
52             {
53                 cnt-=tm/prime[i];
54                 tm/=prime[i];
55             }
56             while(tt)
57             {
58                 cnt-=tt/prime[i];
59                 tt/=prime[i];
60             }
61             if(cnt) res++;
62         }
63         printf("%d\n",res);
64     }
65     return 0;
66 }
时间: 2024-08-28 10:20:02

FZU 1851 组合数的相关文章

FZU 1753-Another Easy Problem(求多个组合数的最大公约数)

Another Easy Problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 1753 Appoint description:  xietutu  (2013-03-13)System Crawler  (2015-04-27) Description 小TT最近学习了高斯消元法解方程组,现在他的问题来了,如果是以下的方程,

FZU 2020-组合(Lucas定理+逆元解决大组合数求模)

题目地址:FZU 2020 题意:求C(n,m)%p的值(1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数). 思路: 对于和并且p是素数,我们一般采用Lucas定理来解. 1).Lucas定理是用来求 C(n,m) mod p的值,p是素数.其描述为: 如果 那么得到 即 Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p) Lucas(n,0,p)=1; 2).对于大组合数求模C(N,

【Lucas组合数定理】组合-FZU 2020

组合 FZU-2020 题目描述 给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数.例如C(5,2) = 10, C(4,2) = 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值! 分析 Lucas定理: 如果我们要求C(n,m)%p的值,那么 进行推导可以得到 这一道题使用Lucas定理的递归式 \[ C^n_m \ mod \ p= C^{n\ mod \ p}_{m\ mod \ p}\times C^{n\div p

fzu 1753 质因数的应用

Another Easy Problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description xtt最近学习了高斯消元法解方程组,现在他的问题来了,如果是以下的方程,那么应该如何解呢? C(n1,m1)==0 (mod M) C(n2,m2)==0 (mod M) C(n3,m3)==0 (mod M) ................ C(n

[Shoi2017]组合数问题 BZOJ4870

这道题可以根据组合数的实际意义来理解,就是从n*k个物品中选择除k余r个物品的方案数,那么就可以得到用f[i][j]表示在前i个物品中,选择j个物品的方案数,其中j是对k取模后的结果,那么f[i][j]=f[i-1][j](在第i为不取)+f[i-1][(j-1+k)%k](在第i为取),可以发现,第i位只与i-1位有关系那么久可以用矩阵快速幂优化, 在做矩阵乘法的时候,要特别注意矩阵乘特别容易爆int,所以矩阵数组要开成long long 另外这道题还有一个坑点,就是当k=1,r=0是,转移到

组合数问题

组合数公式: 计算组合数的递推方法: C[i, j] := C[i - 1, j] + C[i - 1, j - 1]  (0 < i ≤ j ≤ m ≤ n) 与杨辉三角在形式上一致. 代码: for (int i = 1; i <= n; i++) { c[i][1] = i % k; c[i][i] = 1; // 预处理 } for (int i = 2; i <= n; i++) for (int j = 2; j <= i - 1; j++) // 递推 c[i][j]

FZU 2150 Fire Game(点火游戏)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h2 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 18.0000pt } h3 {

1056. 组合数的和

1056. 组合数的和(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入格式: 输入在一行中先给出N(1<N<10),随后是N个不同的非0个位数字.数字间以空格分隔. 输出格式: 输出所有可能组合出来的2

FZU 1096 QS Network

QS Network Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 1096 64-bit integer IO format: %I64d      Java class name: Main In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS.