• GYM 100801 D.Distribution in Metagonia(数论)


    链接: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 }
  • 相关阅读:
    电路学习实战分析之mos-2
    我这博客咋分类的?
    学习shell之后,实战分析
    二叉树,二叉排序树,红黑树 学习
    哈希表 学习
    《转》C语言可变参函数的实现
    Linux工具记录
    苏州之旅有感
    git 命令动画学
    软件工程相关博客
  • 原文地址:https://www.cnblogs.com/7391-KID/p/7631569.html
Copyright © 2020-2023  润新知