CF上有道类似的,做了那个这个简单多了。思路是取模。模等于1如何处理,模等于2如何分类分类讨论后。可解。
解得对数据排序后再输出。
1 /* 3029 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm> 11 #include <cstdio> 12 #include <cmath> 13 #include <ctime> 14 #include <cstring> 15 #include <climits> 16 #include <cctype> 17 #include <cassert> 18 #include <functional> 19 using namespace std; 20 //#pragma comment(linker,"/STACK:102400000,1024000") 21 22 #define mpii map<int,int> 23 #define vi vector<int> 24 #define pii pair<int,int> 25 #define vpii vector<pair<int,int> > 26 #define rep(i, a, n) for (int i=a;i<n;++i) 27 #define per(i, a, n) for (int i=n-1;i>=a;--i) 28 #define clr clear 29 #define pb push_back 30 #define mp make_pair 31 #define fir first 32 #define sec second 33 #define all(x) (x).begin(),(x).end() 34 #define SZ(x) ((int)(x).size()) 35 #define lson l, mid, rt<<1 36 #define rson mid+1, r, rt<<1|1 37 38 vi l, r; 39 40 void dfs(int m) { 41 int tmp = m % 3; 42 int m_; 43 44 if (m == 0) 45 return ; 46 47 if (tmp == 2) { 48 m_ = m/3+1; 49 } else { 50 m_ = m/3; 51 } 52 53 dfs(m_); 54 55 rep(i, 0, SZ(l)) 56 l[i] *= 3; 57 rep(i, 0, SZ(r)) 58 r[i] *= 3; 59 60 if (tmp == 2) { 61 r.pb(1); 62 } else if (tmp == 1) { 63 l.pb(1); 64 } 65 } 66 67 int main() { 68 ios::sync_with_stdio(false); 69 #ifndef ONLINE_JUDGE 70 freopen("data.in", "r", stdin); 71 freopen("data.out", "w", stdout); 72 #endif 73 74 int m; 75 int lsz, rsz; 76 77 while (scanf("%d",&m)!=EOF) { 78 l.clear(); 79 r.clear(); 80 dfs(m); 81 sort(all(l)); 82 sort(all(r)); 83 lsz = SZ(l); 84 rsz = SZ(r); 85 printf("%d", rsz); 86 rep(i, 0, rsz) 87 printf(" %d", r[i]); 88 putchar(' '); 89 90 printf("%d", lsz); 91 rep(i, 0, lsz) 92 printf(" %d", l[i]); 93 putchar(' '); 94 } 95 96 #ifndef ONLINE_JUDGE 97 printf("time = %d. ", (int)clock()); 98 #endif 99 100 return 0; 101 }