题目来源:CF 797A
简单题目分析:
给定n和k,问:是否存在k个数(均大于1,但可以相同)的乘积等于n。若没有,输出-1,若有且有多组数据,任意输出一组数据即可。
思路:
唯一分解定理:一个非质数一定可以分解为若干质数的乘积(质数的话则是它本身),而且这种分解是最彻底的,如果你分解的因子中还有合数,那么这个合数可以继续分解,直到所有因数都是质数。
那么,这个题目就可以转化为求质因数的问题:
如果你的质因数的个数小于k,那么不存在这个分解,否则:
把前k-1的质因数当作前k-1个数,把剩余的质因数的乘积当作第k个数。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;
const int MAXN=100000+5;
int factor[MAXN];
int curindex=0;
int main()
{
int n,k,i;
scanf("%d%d",&n,&k);
for(i=2;i<=n;++i) //唯一分解定理的代码实现
{
while(n%i==0)
{
factor[curindex++]=i;
n/=i;
}
}
if(k>curindex)
printf("-1\n");
else
{
int kfactor=1;
for(i=0;i<=k-2;++i)
printf("%d ",factor[i]);
for(i=k-1;i<=curindex-1;++i)
kfactor*=factor[i];
printf("%d",kfactor);
}
return 0;
}