题解:AT_iroha2019_day1_f Head of The Dragon
题面
Head of The Dragon
题面翻译
题目描述
给定整数 \(N\),$ K $ 判断是否能构成满足 $a_1\ ×\ a_2\ ×\ ....\ ×\ a_K \ = N $ 的数列 $ a $,如果能构成,请在数列中按字典顺序构成一个最小的数列。除此之外,要求数列是由 \(2\) 个以上的正整数组成。
输入格式
一行,正整数 \(N\) 和 \(K\)。
\(N\) \(K\)
输出格式
如果不存在满足条件的数列,输出 -1;如果存在,就输出这 \(K\) 个整数。
说明/提示
数据范围:
- $ 1\ \leq\ N\ \leq\ 10^9 $
 - $ 1\ \leq\ K\ \leq\ 10^9 $
 
样例解释 \(1\):
$ 2\ × 3\ × 5\ = 30 $,所以这个数列满足条件。满足条件的还有 3 2 5 和 5 2 3 等数列也可以,但是字典顺序中最小的是 2 3 5,所以它是最后输出的答案。
样例解释 \(2\):
怎么样都不能构成数列。
题目描述
整数 $ N $ , $ K $ が与えられます。 $ a_1\ ×\ a_2\ ×\ ....\ ×\ a_K\ =\ N $ を満たす数列 $ a $ を構成できるか判定し、構成できるならばその数列の中で辞書順で最小の数列を一つ構成してください。 なお、数列の各要素は $ 2 $ 以上の正の整数から構成されていなければならないものとします。
输入格式
正整数$ N \(と\) K $が一行で与えられます。
$ N K $
输出格式
条件を満たす数列が存在しない場合、-1を単独で出力してください。 そうでない場合、整数を $ K $ 個出力してください。
样例 #1
样例输入 #1
30 3
样例输出 #1
2 3 5
样例 #2
样例输入 #2
30 4
样例输出 #2
-1
样例 #3
样例输入 #3
123456 7
样例输出 #3
2 2 2 2 2 2 1929
提示
制約
- $ 1\ \leq\ N\ \leq\ 10^9 $
 - $ 1\ \leq\ K\ \leq\ 10^9 $
 
Sample Explanation 1
$ 2\ ×\ 3\ ×\ 5\ =\ 30 $なのでこの数列は条件を満たしています。 他に3 2 5や5 2 3などの数列も考えられますが、辞書順で最小なのは2 3 5なので解としては不適切です。
Sample Explanation 2
どのようにしても数列を構成することができません。
题目大意
得知 \(n\) 和 \(k\) ,求出 \(n\) 是否能分解出 \(k\) 个因数相乘,输出按字典序最小一种情况。
步骤
- 将 \(n\) 分解质因数。
 - 判断质因数个数是大于 \(k\),否则输出 \(-1\) 。
 - 按照分解出来的质因数从小到大输出。
 
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, k, sum = 1;
int v[105];
signed main() {
	cin.tie(0), cout.tie(0);
	cin >> n >> k;
	int cnt = 0, w = n;//cnt 记录因数个数,n 要被分解,用另一个变量存储原来的值
	for (int i = 2; i <= sqrt(w); i++) { //从 2 到 sqrt(n)
		if (cnt == k - 1 && n != 1) {//特判最后一个因数
			v[++cnt] = n;
			break;
		}
		while (n % i == 0) {
			if (cnt == k - 1 && n != 1) {//特判最后一个因数
				v[++cnt] = n;
				break;
			}
			n /= i;
			v[++cnt] = i;//记录因数
		}
	}
	if (cnt < k)	cout << -1;//因数个数不足 k ,输出 -1
	else {//输出
		for (int i = 1; i <= k; i++)
			cout << v[i] << " ";
	}
}
                    
                
                
            
        
浙公网安备 33010602011771号