校賽2

給一個數,表示成一堆有編碼的人的組合,要求互相一一對應,其實就是用一堆數來表示一個數,且獨特,只要把此數分解質因子,把質因子的個數搞成二進制形式再表示出來就好了
</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");
}
}        


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章