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 ...
随机推荐
- C语言基础知识(四)——位操作
一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...
- 【MySQL】如何解决分库分表遇到的自增主键的问题?
雪花算法 Redis生成主键
- [安全] HTTPS的理解
一.概述 在下面的章节,我们要搞明白以下几个问题: HTTP和HTTPS的区别,为什么要使用HTTPS HTTPS如何解决加密问题 HTTPS如何避免中间人攻击 CA证书是什么 CA证书是如何申请和颁 ...
- Ef core 如何设置主键
在正题之前,先说明几个问题. (1)写 sql 不好吗,为什么要引入 ORM ? 总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑.对 ...
- Docker的iptables规则在iptables重启后丢失
前因后果 1.在跳板机上使用ansible命令测试机器B时,报错如下,于是就怀疑是网络防火墙的问题 10.10.0.86 | FAILED >> { "failed": ...
- 逃离CSDN
2012年2月18日,从CSDN搬家到这里.对于搬家的理由,总觉得该说点什么.我是在2012年1月29日又开始写博客的,在此之前我的CSDN博客闲置了10个月.从1月29日开始,不到1个月的时间建立了 ...
- Hadoop 伪分布模式安装
( 温馨提示:图片中有id有姓名,不要盗用哦,可参考流程,有问题评论区留言哦 ) 一.任务目标 1.了解Hadoop的3种运行模式 2.熟练掌握Hadoop伪分布模式安装流程 3.培养独立完成Hado ...
- Vim的三款实用插件
Vim 是 Linux 下的常用文本编辑器,但也经常被称为是一个上古神器,因为它对于初学者而言相当不友好,也不好入门. 但是,对于高手而言,他们不仅将 Vim 玩得很溜,而且还将它当作代码开发的主要工 ...
- Telegraf和Grafana监控多平台上的SQL Server
问题 SQL Server在很多企业中部署在多个平台上(Windows,Linux和Container),需要一种能支持多平台的解决方案用于收集和展示相关的监控指标. 我选择企业中比较流行的监控展示工 ...
- TCP / IP 精彩回顾-必看
TCP/IP 协议出现的原因是互联网世界各个主机作为一个个独立的个体,如何制定统一的规则让他们互相通信是达成万物互联的纽带.基于此,设定了 TCP/IP 协议来规范网络访问行为.TCP/IP 并不是一 ...