POJ PKU 3421 数学
(2010-04-20 20:20:45)
标签:
pojpku3421it |
分类: 杂题 |
题目描述:
给你一个数X,让你写一个整数递增序列,从1开始,到X结束,要求任意两个相邻的元素,后面的是前面的整数倍,即前面的整除后面的。
问你这个序列最长是多长,并且这个最长的长度有几种。
解题报告:
我们知道,任意一个正整数都能分解成素数的乘积
X = P1^a1 * P2^a2 * P3^a3.......Pn^an
P1,P2,P3是素数,a1,a2,a3是次方,所以把他们展开即 sum = a1 ... an的和就是最大的长度。(因为素数不能再分了)
种数就是排列组合了,一共sum个数字,a1个相同的,a2个相同的。。。。
所以一共有sum! / (a1! * a2! .... * an!)。
由于X最大2^20,所以n不会超过20,所以求到20的阶乘就可以了。long long可以存下。
注意,阶乘要事先存好,比如fac[m]表示m的阶乘,不能对每一个数都重算,不然会超时。
代码如下:
#include<iostream>
using namespace std;
#define maxn 1050000
#define maxp 100000
char mk[maxn];
int prime[maxp], pnum;
void Prime(int n)
{
}
int x, ans[25], cnt, sum;
__int64 re, fac[23];
void ini()
{
}
int main()
{