给一个数,表示成一堆有编码的人的组合,要求互相一一对应,其实就是用一堆数来表示一个数,且独特,只要把此数分解质因子,把质因子的个数搞成二进制形式再表示出来就好了
</pre><pre name="code" class="cpp">//以后记得要用2进制做题
#include<iostream>//我的i代码 ,POW函数还是自己写好了。。。虽然弱多了,主要就是要想到二进制吧。。
//素数打表要学着
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cmath>
#define ll __int64
using namespace std;
ll m;
ll result[32000];
ll tip;
bool visit[10100000];
ll prime[10000000];
ll res[32005];
ll powt(ll a,ll b)
{
ll n=1;
for(ll i=1;i<=b;i++)
n=n*a;
return n;
}
int init_prim()
{
memset(visit, true, sizeof(visit));
int num = 0;
for (int i = 2; i <= 32005; ++i)
{
if (visit[i] == true)
{
num++;
prime[num] = i;
}
for (int j = 1; ((j <= num) && (i * prime[j] <= 32005)); ++j)
{
visit[i * prime[j]] = false;
if (i % prime[j] == 0) break; //点睛之笔
}
}
//cout<<num<<endl;
return num;
}
void solve(ll y)//考虑大素数!!!
{
int x=init_prim();
// cout<<x<<endl;
for(int i=1;i<=x;i++)
{
if(prime[i]&&y%prime[i]==0)
{
res[i]++;
// cout<<res[i]<<endl;
// cout<<prime[i]<<endl;
y=y/prime[i];
i--;
}
}
tip=1;
if(y!=1)
result[tip++]=y;
for(int i=1;i<=x;i++)
{
ll temp=1;
while(res[i])
{
//cout<<res[i]<<endl;
if(res[i]&1)
{
result[tip++]=powt(prime[i],temp);
//cout<<result[tip-1];
}
temp=temp*2;
res[i]/=2;
}
}
}
int main()
{
ll cas;ll i;
scanf("%I64d",&cas);
while(cas--)
{
scanf("%I64d",&m);
memset(result,0,sizeof(result));
solve(m);
sort(result+1,result+tip);
for(i=1;i<=tip-2;i++)
printf("%I64d ",result[i]);
printf("%I64d",result[tip-1]);
printf("\n");
}
}