Gym - 100801D:Distribution in Metagonia (數學)
阿新 • • 發佈:2018-08-14
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> #definell 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 (數學)