输入正整数 XX,求 XX 的大于 11 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。
输入格式
输入包含多组数据,每组数据占一行,包含一个正整数表示 XX。
输出格式
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。
每个结果占一行。
数据范围
1≤X≤2201≤X≤220
输入样例:
2
3
4
10
100
输出样例:
1 1
1 1
2 1
2 2
4 6
思路:由于是要求这个序列的任意一项能整除他的前一项,要想要这个序列最大,那么任意两项之间的倍数要求最小。那么最小就是一个质数。由于序列都是由X的因子组成,所以每个数字都是有质因子组成的。初始值为1的话,X一共有几个质因子,序列最大有几个数字。
#include<iostream> using namespace std; const int maxn= (1 << 20 ) + 10; int primes[maxn],cnt; bool st[maxn]; int minp[maxn]; long long f[30]; void get_prime(int n) { for(int i=2;i<=n;i++) { if(!st[i]) { primes[++cnt]=i; minp[i]=i; } for(int j=1;primes[j]*i<=n;j++) { st[primes[j]*i]=true; minp[primes[j]*i]=primes[j]; if(i%primes[j]==0) { break; } } } } int main() { get_prime(maxn); f[0]=1; for(int i=1;i<=20;i++) { f[i]=f[i-1]*i; } int x; while(cin >> x) { long long res=1; int tot=0; while(x>1) { int p=minp[x]; int k=0; while(x%p==0) { x/=p; tot++,k++; } res*=f[k]; } cout << tot << " " << f[tot]/res << endl; } return 0; }