题意:我们需要按照一定的顺序输出a的所有因数,同时要保证,从第二个数开始每个数都必须由其前一个数乘以某个质数或除以某个质数得出的。
思路:各质数 的 幂次方 组合,每次 每个幂方 之和 大小 改变为1。
以题目中样例来说 a=(2^3)*(3^2)=72。易得a所有因数为:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<ll> ans;
ll p[25],k[25];
int a;
int main()
{
int n;cin >> n;ll sum=1;
for(int i=1;i<=n;i++)
{
cin >> p[i] >> k[i];
a=a+p[i]<<k[i];
sum*=k[i]+1;//因数个数
}
ans.push_back(1);
ll cont=1;
for(int i=1;i<=k[1];i++) cont*=p[1],ans.push_back(cont);
for(int i=2;i<=n;i++)
{
int len1=ans.size();
for(int j=1;j<=k[i];j++)
{
int len2=ans.size();
for(int K=0;K<len1;K++) ans.push_back(ans[len2-K-1]*p[i]);
}
}
for(int i=0;i<sum;i++){
cout<<ans[i]<<endl;
}
} 
京公网安备 11010502036488号