#include
#include
#include
using namespace std;
int ff[450][450]; //预处理f(n, p)
int f(int n, int p){
long long res = 0;
while(n){
res += n/p;
n /= p;
}
return res;
}
vector > prime; //n!的素因子就是1~n中的素数,第一个记录素因子,第二个记录个数
bool noprime[440];
void Prime(){
prime.clear();
for (int i = 2; i <= 431; i ++){
if (!noprime[i]){
prime.push_back(make_pair(i, 0));
for (int j = i; j <=431; j ++)
ff[j][i] = f(j, i);
}
for (int j = 0; j < prime.size() && prime[j].first*i <= 431; j ++){
noprime[prime[j].first*i] = 1;
if (i % prime[j].first == 0)
break;
}
}
}
long long ans[450][450]; //预处理factor(n,k)
long long factor(int n, int k){
long long res = 1;
for (int i = 0; i < prime.size(); i ++){
if (prime[i].first > n)
break;
int p = prime[i].first;
prime[i].second = ff[n][p];
if (p <= k)
prime[i].second -= ff[k][p];
if (p <= (n - k))
prime[i].second -= ff[n-k][p];
res *= (prime[i].second + 1);
}
return res;
}
int main(){
Prime();
int n, k;
for (int i = 0; i <= 431; i ++){
for (int j = 0; j <= i; j ++)
ans[i][j] = factor(i, j);
}
while(scanf("%d%d", &n, &k) == 2){
printf("%I64d\n", ans[n][k]);
}
return 0;
}
POJ 2992 Divisors ★ (n!分解素因子)
转载
题目大意:求C(n, k)的约数个数
预备知识:n!分解素因子 Here.
C(n, k) = n!/(k! * (n-k)!)
显然我们只要求出C(n,k)的素因子及其个数就可以了.
首先我们是可以知道n!的素因子的:1~n的素数,又因为C(n, k)是整数,显然k!和(n-k)!的素因子n!都有.
那么我们枚举n!的素因子,C(n,k)的素因子p的个数 = f(n, p) - f(k, p) - f(n-k, p). (f(n ,p)表示n!中素因子p的个数)
然后+1乘起来即可.
PS:这题POJ的数据逆天啊……N多组数据……必须先把所有函数都预处理用数组记录下来,不然会TLE……
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
cron表达式详细讲解
cron表达式简介
cron表达式 -
因式分解
常见多项式,二项式定理,杨辉三角
杨辉三角 多项式 分享 -
用非递归法对整数因式分解python
首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把序列分成了两部分,前半部分无序,后半部分升序排列,并且后半部分的数都大于前半部的数。 由此可得到快速排序和冒泡排序的一些共同点: 都要经历n趟排序 每趟排序要经历O(n)次比较
用非递归法对整数因式分解python 数据结构与算法 快速排序 冒泡排序 递归