Divisors

题目链接(点击)

Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation?

Input

The input consists of several instances. Each instance consists of a single line containing two integers n and k (0 ≤ k ≤ n ≤ 431), separated by a single space.

Output

For each instance, output a line containing exactly one integer -- the number of distinct divisors of Cnk. For the input instances, this number does not exceed 2 63 - 1.

Sample Input

5 1
6 3
10 4

Sample Output

2
6
16

思路:

之前用求逆元的方法可以将组合数的最终值求出来,但是这个题目并没有给出要mod的值,所以先将结果求出来然后用唯一分解定理求因子个数的思路行不通。(即使求出来,结果也肯定会爆LL,导致根本无法将整个数保留下来求因子个数)

后来尝试将阶乘的前几个的值求出来然后求因子个数最后将 每个个数 相乘就得到结果

例如:C(9,3)

= 9 * 8 * 7

3 * 2 * 1

先将   9/3=3 的因子个数 2

8/2=4 的因子个数 3

7/1=7 的因子个数 2

然后   相乘 即: 2*3*2=12 即为答案

但是这样也是错的,因为这样 可能会导致后面的数分母不能化为1

例如: C(10,5)

= 10 * 9 * 8 * 7 * 6

5  * 4 * 3 * 2 * 1

先将10/5=2的 因子个数 2

9/4= ??这就错了

*************************************************************************************************************************************************

后来听同学的思路:

1.将1~431的每个素数个数用数组存起来

例: 10

sum[10][2]=1;

sum[10][3]=0;

sum[10][5]=1;

:

:

同时最好可以在打表的时候将n!对应素数个数直接存起来(特别好实现):

 num[i][prime[j]]=num[i-1][prime[j]]+count1  ///就可以了

2.求出分母的每个素数的个数

3.求出分子的每个素数的个数

4.将上面的数目对应相减就是最终值通过唯一分解定理得出的素数乘积

例:C(9,3)

9 =3^2               3=3^1

8=2^3                2=2^1

7=7^1                1=2^0

即:   3^2 * 2^3 * 7^1

3^1 * 2^1 * 2^0

结果: 3^1 * 7^1 * 2^2

所以:   (1+1)* (1+1) * (2+1)=12;

*************************************************************************************************************************************************

AC代码:

#include<stdio.h>
typedef long long LL;
int prime[505],flag[505];
void allprime()
{
int count=0;
for(int i=2;i<=431;i++){
if(flag[i]==0){
prime[count++]=i;
}
for(int j=0;j<count&&prime[j]*i<=431;j++){
flag[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}/// 82个
} //欧拉筛素数
int num[505][505];
int up,down;
int main()
{
allprime();
for(int i=1;i<=431;i++){
int num1=i;
for(int j=0;j<=82;j++){
int count1=0;
while(num1%prime[j]==0){
count1++;
num1/=prime[j];
}
num[i][prime[j]]=num[i-1][prime[j]]+count1;
}
} //打表
//printf("*%d\n",num[9][3]);
int n,k;
while(~scanf("%d%d",&n,&k)){
LL sum=1;
for(int i=0;i<=82;i++){
up=num[n][prime[i]]-num[n-k][prime[i]];
down=num[k][prime[i]];
sum*=(up-down+1);
}
printf("%lld\n",sum);
}
return 0;
}

Divisors (求解组合数因子个数)【唯一分解定理】的更多相关文章

  1. HDU-1492-The number of divisors(约数) about Humble Numbers -求因子总数+唯一分解定理的变形

    A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...

  2. POJ1845Sumdiv(求所有因子和 + 唯一分解定理)

    Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17387   Accepted: 4374 Descripti ...

  3. Divisors_组合数因子个数

    Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- ...

  4. POJ 2992 Divisors (求因子个数)

    题意:给n和k,求组合C(n,k)的因子个数. 这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE.所以得用别的方法. 在说方 ...

  5. 2018.09.28 牛客网contest/197/A因子(唯一分解定理)

    传送门 比赛的时候由于变量名打错了调了很久啊. 这道题显然是唯一分解定理的应用. 我们令P=a1p1∗a2p2∗...∗akpkP=a_1^{p_1}*a_2^{p_2}*...*a_k^{p_k}P ...

  6. Almost All Divisors(求因子个数及思维)

    ---恢复内容开始--- We guessed some integer number xx. You are given a list of almost all its divisors. Alm ...

  7. UVA294DIvisors(唯一分解定理+约数个数)

    题目链接 题意:输入两个整数L,U(L <= U <= 1000000000, u - l <= 10000),统计区间[L,U]的整数中哪一个的正约数最多,多个输出最小的那个 本来 ...

  8. hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  9. B - Common Divisors (codeforces)数论算法基本定理,唯一分解定理模板

    You are given an array aa consisting of nn integers. Your task is to say the number of such positive ...

随机推荐

  1. 限制某个顶点度数的最小生成树 poj1639

    Picnic Planning Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10642   Accepted: 3862 ...

  2. tp5插入百万条数据处理优化

    <?php namespace app\index\controller; use think\Controller; use think\Db; class Charu extends Con ...

  3. P2812 校园网络

    luogu 传送门 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这个学校( ...

  4. [Unity2d系列教程] 003.Unity如何调用android的方法

    Unity开发的时候很多时候我们需要用到底层的一些功能,比如摄像,录音,震动等等,我们在Unity的层面是无法完成的.那么我们考虑到Unity是否可以直接调用到android方面的方法,替我们去完成我 ...

  5. [wordpress使用]004_导入多媒体

    在写文章的时候难免要需要用到图片.音频或者视频文件,wordpress不仅提供本地上传多媒体文件功能,更提供在线导入多媒体.能更方便,范围更大的获取我们所需要的资源. 本地上传文件 在写文章的界面,选 ...

  6. 分别针对Customers表与Order表的通用查询操作

    1.针对customers表通用的查询操作 CustomerForQuery package com.aff.PreparedStatement; import java.lang.reflect.F ...

  7. 【题解】P6218 [USACO06NOV] Round Numbers S

    题目传送门 这是一道数位DP. 令 \(dp_{i,j,k}\) 为满足由 \(i\) 位组成,且其中有 \(j\) 个1,第 i 位(从右往左数)为 \(k\) 的二进制数的数量. 可以得出状态转移 ...

  8. Nessus静态ip配置及内网扫描

    环境ubuntu虚拟机,以前linux配置ip都是从/etc/network/interfaces这里面更改,现在要在/etc/netplan下面配置. vim /etc/netplan/01-net ...

  9. 50个SQL语句(MySQL版) 建表 插入数据

    本学期正在学习数据库,前段时间老师让我们做一下50个经典SQL语句,当时做的比较快,有一些也是百度的,自我感觉理解的不是很透彻. 所以从本篇随笔开始,我将进行50个经典SQL语句的复盘,加深理解. 答 ...

  10. jchdl - GSL实例 - Mux4

    https://mp.weixin.qq.com/s/hh0eExVFC6cxzpvNI1cA9A 使用门实现四选一选择器. 原理图 ​​ 参考链接 https://github.com/wjcdx/ ...