POJ3421:X-factor Chains——题解

http://poj.org/problem?id=3421

题目大意:一个数列,起始为1,终止为一给定数X,满足Xi < Xi+1 并且Xi | Xi+1。

求出数列最大长度和该长度下的情况数。

——————————————

很简单想到分解X质因数,这样我们每加一个数就是前一个数*其中一个质因数即可。

所以长度为质因数个数。

至于情况数,就是有重复的排列数,去重即可求。

(不开longlong见祖宗,十年OI一场空)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
typedef long long ll;
using namespace std;
int su[1025];
bool he[1025];
ll t[1025];
int cnt=0;
ll sum=0;
void Euler(int n){
    for(int i=2;i<=n;i++){
    if(he[i]==0){
        cnt++;
        su[cnt]=i;
    }
    for(int j=1;j<=cnt&&i*su[j]<=n;j++){
        he[su[j]*i]=1;
        if(i%su[j]==0)break;
    }
    }
    return;
}
void fen(ll x){
    for(int i=1;i<=cnt&&su[i]*su[i]<=x;i++){
    ll p=su[i];
    if(x%p==0){
        while(x%p==0){
        sum++;
        t[i]++;
        x/=p;
        }
    }
    }
    if(x>1)sum++;
    return;
}
ll jie(int k){
    ll ans=1;
    for(int i=2;i<=k;i++){
    ans*=i;
    }
    return ans;
}
int main(){
    Euler(1024);
    ll x;
    while(scanf("%lld",&x)!=EOF){
    if(x==0)break;
    memset(t,0,sizeof(t));
    sum=0;
    fen(x);
    printf("%lld ",sum);
    ll ans=jie(sum);
    for(int i=1;i<=cnt;i++){
        ans/=jie(t[i]);
    }
    printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-11-08 16:06:55

POJ3421:X-factor Chains——题解的相关文章

UVa 818 Cutting Chains 题解

难度:β 建议用时:40 min 这题应该有迭代加深搜索的解法的,但我参考网友做法,用暴力枚举法. 大致思路是:枚举圆环的每种开闭状态,统计符合要求的最小的打开的圆环的数量. 要判断打开圆环的某一种方法是否符合要求,容易想到的一个是先判断除去这些已打开的圆环外的闭合圆环有没有组成一个环. 如果还有环,那么无论把打开的圆环怎样重新连城一条链套回去,都不能消除环,而题目要求我们够一条链.所以如果任然存在环的方法是不行的. 0000   0 (此时还有一个环没打开,不能组成链) 0    0 0000

ZOJ1937:Addition Chains——题解

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1937 题目大意:创造一个数列,使得它: 1.单调不递减. 2.其中一个元素一定存在其前面两个元素之和与它相等. 3.开头为1,结尾为n. 求一个这样的最短数列. —————————————————————————————————— IDA*一定的(n<=100) 对于IDA*是什么不了解的,可以看我的置顶骑士精神那道题. 我们的估价函数就是当前的值翻多少次二倍后能得到n.

poj3421 X-factor Chains(重复元素的全排列)

poj3421 X-factor Chains 题意:给定正整数$x(x<=2^{20})$,求$x$的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的子序列的个数. 显然最大长度就是$x$的质因数个数(一个一个加上去鸭) 而满足最大长度的子序列个数.... 这不就是可重复元素的全排列吗! 有这么一个公式,设元素总个数$n$,每个重复元素的个数$m_{i}$,共$k$种不同元素 则全排列个数$=\frac{n!}{\prod_{i=1}^{k}m_{i}!}$ 发现$n

poj3421 X-factor Chains——分解质因数

题目:http://poj.org/problem?id=3421 好久没有独立A题了...做点水题还是有助于提升自信心的: 这题就是把 x 质因数分解,质因数指数的和 sum 就是最长的长度,因为每次至少乘一个质因数: 排列方式就是从 sum 个位置里给第一种质因数选几个位置,再在剩下的里面给第二种质因数选几个位置... 也就是 ans = ∏(1<=i<=cnt) C(n,pc[i]),n -= pc[i],其中 cnt 是质因数(种类)个数,pc 是每种质因数的指数,n 就是目前剩下几个

POJ3421 X-factor Chains

嘟嘟嘟 题目大意:给一个数x,让你求这样一个最长的序列,以及最长的序列的种数: 1.第0项为1,最后一项为x(序列长度不算这两项). 2.每一项都是x的因子. 3.对于任意的ai和ai+1,ai < ai+1且ai | ai+1. 每一项都是x的因子,那么先把x分解质因数,用这些数凑成的数一定都是x的因子.然后要满足第三条,那么ai+1一定由ai乘以一个质因数得到,所以最长长度就是质因数指数之和tot. 再求方案:先不考虑pici中,ci = 1,那么第一个数有tot种选法,第二个数有tot -

Project Euler:Problem 74 Digit factorial chains

The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145: 1! + 4! + 5! = 1 + 24 + 120 = 145 Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it tu

洛谷 P1313 计算系数 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1313 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开. 输出格式: 输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007

HDU 5428 The Factor 分解因式

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5428 The Factor Accepts: 101 Submissions: 811 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大

254. Factor Combinations

题目: Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a function that takes an integer n and return all possible combinations of its factors. Note: Each combination's factors must be sorted ascending, for e