链接: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 }