Divisors (求解组合数因子个数)【唯一分解定理】
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 (求解组合数因子个数)【唯一分解定理】的更多相关文章
- 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, ...
- POJ1845Sumdiv(求所有因子和 + 唯一分解定理)
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17387 Accepted: 4374 Descripti ...
- Divisors_组合数因子个数
Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- ...
- POJ 2992 Divisors (求因子个数)
题意:给n和k,求组合C(n,k)的因子个数. 这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE.所以得用别的方法. 在说方 ...
- 2018.09.28 牛客网contest/197/A因子(唯一分解定理)
传送门 比赛的时候由于变量名打错了调了很久啊. 这道题显然是唯一分解定理的应用. 我们令P=a1p1∗a2p2∗...∗akpkP=a_1^{p_1}*a_2^{p_2}*...*a_k^{p_k}P ...
- Almost All Divisors(求因子个数及思维)
---恢复内容开始--- We guessed some integer number xx. You are given a list of almost all its divisors. Alm ...
- UVA294DIvisors(唯一分解定理+约数个数)
题目链接 题意:输入两个整数L,U(L <= U <= 1000000000, u - l <= 10000),统计区间[L,U]的整数中哪一个的正约数最多,多个输出最小的那个 本来 ...
- hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- B - Common Divisors (codeforces)数论算法基本定理,唯一分解定理模板
You are given an array aa consisting of nn integers. Your task is to say the number of such positive ...
随机推荐
- 【pyecharts】地图显示不全
官网给的解释如下: 自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件. 如用户需要用到地图图表,可自行安装对 ...
- Shone.Math开源系列2 — 实数类型(含分数和无理数)的实现
Shone.Math开源系列2 实数类型(含分数和无理数)的实现 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 摘要: ...
- vim的基础命令
:q 退出 :wq 保存并退出 :q! 不保存并退出 :w 保存 :w! 强行保存
- [JavaWeb基础] 015.Struts2 表单验证框架
在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...
- Rocket - util - AsyncQueue
https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw 简单介绍异步队列(AsyncQueue)的实现. 0. 异步队列 异步队列的两端分 ...
- Java并发编程 (五) 线程安全性
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.安全发布对象-发布与逸出 1.发布与逸出定义 发布对象 : 使一个对象能够被当前范围之外的代码所使用 ...
- 判断IP地址的合法性
每台计算机都有独一无二的编号,称为ip地址,每个合法的ip地址由‘.’分隔开的4个数字组成,每个数字的取值范围为0--255 输入一个字符串,判断其是否为合法的IP地址,若是输出‘YES’,否则输出‘ ...
- Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
合法括号序列 题目 问题描述 由1对括号,可以组成一种合法括号序列:(). 由2对括号,可以组成两种合法括号序列:()().(()). 由4对括号组成的合法括号序列一共有多少种? 答案提交 这是一道结 ...
- Java实现 LeetCode 410 分割数组的最大值
410. 分割数组的最大值 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: ...
- Java实现 LeetCode 188 买卖股票的最佳时机 IV
188. 买卖股票的最佳时机 IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多 ...