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#中各种线程的使用及注意项~
说到线程,很多人会想到timer吧, 接下来我们就来学习一下 timer 吧,摇摇脑袋,清醒一下,接下来开始学习.... 一.基本概念 1.什么是进程? 当一个程序开始运行时,它就是一个 ...
- CF820D Mister B and PR Shifts
题目链接:http://codeforces.com/problemset/problem/820/D 题目大意: 给出一个\(n\)元素数组\(p[]\),定义数组\(p[]\)的误差值为\(\su ...
- 图像分析之梯度L0范数平滑
本文是Image Smoothing via L0 Gradient Minimization一文的笔记.L0 Gradient Smoothing的formulation与TV和WLS等基于变分的模 ...
- c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]
前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...
- nodejs模块介绍与使用
1.内置模块 http fs path url os等等 (无需安装直接require引入即可) 2.第三方模块: express mysql ejs等等 (npm包管理工具下载require引入) ...
- [工具-007] C#手机短信发送
本工具是基于中国网建SMS短信通的API进行开发的,主要功能就是用注册的号码对指定的号码发送短信,此功能主要应用于企业营销方面. 中国网建SMS短信通http://www.smschinese.cn/ ...
- [JavaWeb基础] 009.Struts2 上传文件
在web开发中,我们经常遇到要把文件上传下载的功能,这篇文章旨在指导大家完成文件上传功能 1.首先我们需要一个上传文件的页面. <!--在进行文件上传时,表单提交方式一定要是post的方式, 因 ...
- Beta冲刺 —— 总结随笔
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.项目预期计划: 1.对于初版小程序的现 ...
- jchdl - GSL实例 - Mul(无符号数的乘法)
这里实现最原始的阵列乘法,逐位相乘然后加到一起. 参考链接 https://github.com/wjcdx/jchdl/blob/edcc3e098d4f1cb21677e86e87a114 ...
- 【Kafka】知识总结
Kafka是什么? Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. Kafka架构 1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对 ...