1. 程式人生 > >GYM 100801 D.Distribution in Metagonia(數論)

GYM 100801 D.Distribution in Metagonia(數論)

main 輸出 pac stdin 題意 ring ans ons names

鏈接:http://codeforces.com/gym/100801

題意:給一個正整數n,將n拆分為若幹個數的和,每個數都是型如2^p*3^q,且兩兩互不整除。

分析:如果n=2^p*3^q,直接輸出n;如果n=2^p*3^q*k,k不能被2或3整除,先拆分k,然後再把拆分結果乘2^p*3^q即可;如果n不能被2或3整除,n必然是奇數,然後又不能拆1,所以必然會拆一個3的冪出來,為了避免重復,拆一個盡量大的出來,剩下的是個偶數,遞歸一下解決。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4
#include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 const ll maxn=1e18+5; 8 ll ans[1000]; 9 int devide(ll n,ll *a){ 10 ll mu=1; 11 int cnt=0; 12 if(n==1){ 13 a[0]=mu; 14 return 1; 15 } 16 if(n%2==0||n%3==0){ 17 while(n%2==0){ 18 n/=2
;mu*=2; 19 } 20 while(n%3==0){ 21 n/=3;mu*=3; 22 } 23 if(n==1){ 24 a[0]=mu; 25 return 1; 26 } 27 cnt=devide(n,a); 28 for(int i=0;i<cnt;i++) 29 a[i]*=mu; 30 return cnt; 31 } 32 a[0]=1;
33 while(a[0]*3<n)a[0]*=3; 34 cnt=devide(n-a[0],a+1)+1; 35 return cnt; 36 } 37 int main(){ 38 // freopen("distribution.in","r",stdin); 39 // freopen("distribution.out","w",stdout); 40 // freopen("e:\\in.txt","r",stdin); 41 ll t,n,m; 42 cin>>t; 43 while(t--){ 44 cin>>n; 45 m=devide(n,ans); 46 // sort(ans,ans+m); 47 cout<<m<<endl; 48 for(int i=0;i<m;i++){ 49 if(i)cout<< ; 50 cout<<ans[i]; 51 } 52 cout<<endl; 53 } 54 return 0; 55 }

GYM 100801 D.Distribution in Metagonia(數論)