题目链接: 点我 题目大意: 给出一个X,求一个1……X的最长递增数列,要求相邻两个可以整除,在求出有多少个这样的数列。比如给出6。1,2,6(这是最长)1,3,6(这是第二种). 题目解析: X分解质因数的个数就是最长的数列,再把质因数排列组合一下就好了。 PS:输出longlong型的要用“%lld”,WA了半天。。。
Problem: 3421 User: ChenyangDu Memory: 4944K Time: 422MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn = 1<<20; int n,length,primes,is_prime[maxn]; vector <int> prime_c; struct num{int id,times;}; num Num(int id,int times){ num t; t.id = id; t.times = times; return t; } long long A(int a){ long long ans = 1; for(int i=1;i<=a;i++){ ans *= i; } return ans; } void get_prime(){ memset(is_prime,-1,sizeof(is_prime)); for(int i=2;i<(maxn);i++){ if(is_prime[i]){ for(int j=i;j<(maxn);j+=i){ is_prime[j] = false; } prime_c.push_back(i); } } } int main(){ //freopen("in.txt","r",stdin); get_prime(); while(scanf("%d",&n) == 1){ length = primes = 0; vector <num> prime; for(int j=0;j<prime_c.size();){ int i = prime_c[j]; if(i>n)break; if(n%i == 0){ primes++; if(prime.empty() || prime.back().id != i){ prime.push_back(Num(i,1)); }else { prime.back().times++; } n /= i; }else j++; } long long ans = A(primes); for(int i=0;i<prime.size();i++){ ans /= A(prime[i].times); } printf("%d %lld\n",primes,ans); } return 0; }