码迷,mamicode.com
首页 > Web开发 > 详细

GYM 100801 D.Distribution in Metagonia(数论)

时间:2017-10-06 15:27:23      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:解决   ace   distrib   class   sort   pac   force   bsp   nbsp   

链接: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(数论)

标签:解决   ace   distrib   class   sort   pac   force   bsp   nbsp   

原文地址:http://www.cnblogs.com/7391-KID/p/7631569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!