GYM 100801 D.Distribution in Metagonia(数论)

Posted 7391_KID

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于GYM 100801 D.Distribution in Metagonia(数论)的主要内容,如果未能解决你的问题,请参考以下文章

Gym - 100801H Hash Code Hacker (构造)

Gym - 100801D:Distribution in Metagonia (数学)

Gym101522A Gym101522C Gym101522D

Gym Gym 101147G 第二类斯特林数

OpenAI Gym 入门与提高 Gym环境构建与最简单的RL agent

强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)