1. 程式人生 > >Gym - 100801D:Distribution in Metagonia (數學)

Gym - 100801D:Distribution in Metagonia (數學)

unsigned clas 是個 ++ gym num 思路 c++ --

題意:給定一個N,讓你把它拆成若幹個只含素因子2和3的數之和,且兩兩之間沒有倍數關系,比如10=4+6。

思路:即是2因子的冪遞增,3因子的冪遞減;或者反之。

對於當前N,我們拆分出的數為num=2^x*3^y;滿足2^x|N,而且y最大,然後把繼續拆分N-num。不難推出,N-num是個偶數,且至少含有x+1個2之積,那麽N-num的2的冪一定>x;而3的冪一定<y。 用公式不難驗證:N=2^x(3^y+2*....); num=前面部分,N-num=後面部分,2因子至少多出來一個,而3因子肯定會變少。

#include<bits/stdc++.h>
#define
ll unsigned long long using namespace std; const int maxn=1000010; ll ans[maxn],num; int main() { int T,i; ll N,tmp,tN; cin>>T; while(T--){ cin>>N; num=0; while(N){ tmp=1; tN=N; while(tN&&tN%2==0) tmp*=2,tN/=2;
while(tmp*3<=N) tmp*=3; N-=tmp; ans[++num]=tmp; } cout<<num<<endl; for(i=1;i<=num;i++) cout<<ans[i]<<" "; cout<<endl; } return 0; }

Gym - 100801D:Distribution in Metagonia (數學)