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; ...
随机推荐
- 免费在线客服QQ_网页接入及使用说明
首先,注册一个QQ (haha,我觉得也是废话) 到QQ推广的网站设置,生成代码 链接:http://shang.qq.com/v3/widget.html 选择“免费开通”,然后就会看到下图,一般只 ...
- openSUSE 国内镜像和镜像使用帮助 (zhuan)
https://my.oschina.net/u/2475751/blog/631036?p={{currentPage-1}} https://lug.ustc.edu.cn/wiki/mirror ...
- Sqlserver_自定义函数操作
use Test go if exists( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'gettime') AND type in ...
- hiho_1062_最近公共祖先
题目大意 给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先. 分析 数据量较小,对于每次查询都进行如下操作: 先找出person1到达根节 ...
- sql中charindex
假如你写过很多程序,你可能偶尔会碰到要确定字符或字符窜串否包含在一段文字中,在这篇文章中,我将讨论使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.我将告诉你这两个函数是如何运转的,解 ...
- drush cc all 报错
请看好 指明了Module文件的行数 报错一定要多看看哦.
- HTTP 头部解释
1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Charset:浏览器申明自己 ...
- 和为S的两个数VS和为S的连续正数序列
其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查 ...
- App crash 报错 'NSUnknownKeyException'
报错: *** Terminating app due to uncaught exception , reason: '[<NSObject 0x6e36ae0> setValue:fo ...
- Java集合——Set接口
1.定义 set中不允许放入重复的元素(元素相同时只取一个),使用equals()方法进行比较.如果返回true,两个对象的HashCode值也应该相等 2.方法 add():添加元素 remove( ...