POJ 2992 求组合数的因子个数
求C(n,k)的因子个数
C(n,k) = (n*(n-1)*...*(n-k+1))/(1*2*...*k) = p1^k1 * p2^k2 * ... * pt^kt
这里只要计算出分子中素数因子个数减去分母中的个数
然后每一种因子都有 (cnt+1)种取的可能,乘一下就出来了
但是不能逐个因子分解,试了两次都错了,后来初始的时候,先将这432个数提前预处理分解好保存到vector中
然后用的时候直接提取就行
不然会因为数据量太大超时的
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <ctime>
- #include <cstdlib>
- #include <vector>
- using namespace std;
- #define ll long long
- #define N 500
- #define pii pair<int,int>
- int cnt[N+] , prime[N+] , tot;
- bool check[N+];
- vector<pii> v[N];
- void init()
- {
- check[] = true;
- for(int i= ; i<=N ; i++)
- {
- if(!check[i]) prime[tot++] = i;
- for(int j=i+i ; j<=N ; j+=i) check[j]=true;
- }
- }
- void fenjie(int x)
- {
- int tmp = x;
- for(int i= ; i<tot ; i++){
- if(prime[i]>x) break;
- int cnt = ;
- while(x%prime[i]==){
- x/=prime[i];
- cnt++;
- }
- if(cnt) v[tmp].push_back(make_pair(prime[i] , cnt));
- }
- if(x>) v[tmp].push_back(make_pair(x , ));
- }
- void solve(int n , int k)
- {
- memset(cnt , , sizeof(int)*(n+));
- for(int i= , up=n , dn= ; i<=k ; i++ , up-- , dn++){
- int l1 = v[up].size() , l2 = v[dn].size();
- for(int i= ; i<l1 ; i++) cnt[v[up][i].first] += v[up][i].second;
- for(int i= ; i<l2 ; i++) cnt[v[dn][i].first] -= v[dn][i].second;
- }
- ll ret = ;
- for(int i= ; i<tot ; i++){
- if(prime[i]>n) break;
- ret *= (cnt[prime[i]]+);
- }
- printf("%I64d\n" , ret);
- }
- int main() {
- // freopen("a.in" , "r" , stdin);
- // freopen("out.txt" , "w" , stdout);
- init();
- for(int i= ; i<= ; i++) {v[i].clear();fenjie(i);}
- int n , k;
- while(~scanf("%d%d" , &n , &k)){
- solve(n , k);
- }
- }
POJ 2992 求组合数的因子个数的更多相关文章
- POJ 2992 Divisors (求因子个数)
题意:给n和k,求组合C(n,k)的因子个数. 这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE.所以得用别的方法. 在说方 ...
- N!分解质因子p的个数_快速求组合数C(n,m)
int f(int n,int p) { ) ; return f(n/p,p) + n/p; } https://www.xuebuyuan.com/2867209.html 求组合数C(n,m)( ...
- poj 2992
http://poj.org/problem?id=2992 大意:求(n,k)的因子个数 解题思路:(n,k) = n!/(k!(n-k)!) 任意一个数都可以用其质因子来表示 eg: 26 = ...
- A - Divisors POJ - 2992 (组合数C的因子数)数学—大数
题意:就是求组合数C的因子的个数! 先说一下自己THL的算法,先把组合数求出来,然后将这个大数分解,得到各个素数的个数,再利用公式!用最快的大数分解算法 分析一下时间复杂度! n1/4但是分析一下 ...
- POJ 3978 Primes(求范围素数个数)
POJ 3978 Primes(求范围素数个数) id=3978">http://poj.org/problem? id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内 ...
- 求组合数 C++程序
一 递归求组合数 设函数为void comb(int m,int k)为找出从自然数1.2.... .m中任取k个数的所有组合. 分析:当组合的第一个数字选定时,其后的数字是从余下的m-1个数中 ...
- 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)
这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...
- 51nod1119(除法取模/费马小定理求组合数)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 题意:中文题诶- 思路:这题数据比较大直接暴力肯定是不 ...
- [2011山东ACM省赛] Binomial Coeffcients(求组合数)
Binomial Coeffcients nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; ...
随机推荐
- C++——输入、输出和文件
一.C++输入和输出概述 1.1.流和缓冲区 C++程序把输入和输出看作字节流.输入时,程序从输入流中抽取字节:输出时,程序将字节插入到输出流中.对于面相文本的程序,每个字节代表一个字符,更通俗地说, ...
- Linux配置全局环境变量的方法
总结3种方法: 1.修改/etc/profile 1.1 :首先在此文件中设置环境变量; 1.2:export 设置好的环境变量. #view /etc/profile export ...
- HTML的<body>标签详解与HTML常用的控制标记
一.<body>标签: 用于标记网页的主体,body 元素包含文档的所有内容(比如文本.超链接.图像.表格和列表等等.) 1.body标签中可用的属性: bgcolor="颜色值 ...
- [Selenium] 使用Javascript选中Input框里的内容,然后清空
当我们需要清空Input框里的内容,直接使用el.clear()方法又行不通时,可以使用Javascript先去选中内容,然后再使用el.clear()方法:
- Hbase之取出行数据指定部分+版本控制(类似MySQL的Limit)
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...
- commonJS — 事件处理(for Event)
for Event github: https://github.com/laixiangran/commonJS/blob/master/src/forEvent.js 代码 (function(w ...
- 教你开启红米的USB大容量存储选项,全网首发哦
教你开启红米的USB大容量存储选项,全网首发哦 http://bbs.7to.cn/thread-10732-1-1.html 发表于 2014-4-29 110643 红米note入手也有两天了.各 ...
- [maven] settings 文件节点配置详解
基本结构 <settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...
- [redis] Jedis 与 ShardedJedis 设计
Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...
- vs2010 ctrl+F5闪退解决方法
设置项目的属性页中的“配置属性”->“链接器”->“系统”->“子系统”->“控制台”(即增加“/SUBSYSTEM:CONSOLE”链接选项)