/*
Eva's Balance
Time Limit: 1000MS Memory Limit: 10000K
Total
Submissions: 3149 Accepted: 1564
Description
* Eva has a balance with 20
poises. The weights of the poises are 1, 3, 9, 27,...,3^19.
* Eva asserts
that she has a way to measure any object whose weight is an integer
* from 1
to (3^20-1)/2. Assuming that Eva has placed an object with the weight in this
range
* on the left tray of the balance, your task is to place the proper
poises on the proper trays
* so as to weigh the object out.
Input
*
The first line is an integer T (1 <= T <= 20), which shows the number of
the test cases.
* Each of the following T lines contains an integer W (1
<= W <= (3^20-1)/2), expressing the
* weight of an
object.
Output
* For each test case print a line, showing the weights of
the poises on the left tray and the
* right tray. Use a space to separate
the left tray and the right tray. The poises on the same
* tray are arranged
in the increasing order, and a comma separates every two of them. If there
*
is no poise on the tray, output "empty".
Sample
Input
3
9
5
20
Sample Output
empty 9
1,3 9
1,9
3,27
Source
* POJ Monthly--2004.07.18
*
分析
左侧砝码总重+物体重量=右侧砝码总重
物体重量=右侧砝码总重-左侧砝码总重
所以,问题可以转化为:给出正整数w,对3^i(0<=i<=19)加上权值s
(s=-1,0或者1),使得所有项的总
* 和为w。s=-1对应于砝码放在天平左侧,s=1对应于砝码放在天平右侧,s=0对应于不使用该砝码。
*
列举前10项的情形如下:
* 1 3 9 27 ....
* 0 0 0 0 0
....
* 1 +1 0 0 0 ....
* 2 -1 +1 0 0 ....
*
3 0 +1 0 0 ....
* 4 +1 +1 0 0 ....
* 5 -1
-1 +1 0 ....
* 6 0 -1 +1 0 ....
* 7 +1 -1 +1
0 ....
* 8 -1 0 +1 0 ....
* 9 0 0 +1 0
....
* 10 +1 0 +1 0
....
通过观察,这个表格和基数为3的“进位制”问题很像(如果对最基础的进位制问题的原理和方法不
* 清楚,建议先了解一下)。我们不妨定义映射f
: {0,1,2}-->{0,1,-1},即可将n%3的值相应
*
转换为这里所要求的权值。这里还有一个问题,除第一项以外,之后每一项的“第一个周期”
*
都是不完全的,所以对迭代过程中的n=n/3要作一个修正,考察图中的5,6,7,这三个数的后
*
几项和2相同(红框所示),所以迭代过程应该将5,6,7转换到2,同理2,3,4-->1,8,9,10-->3等
*
等,n=n/3最后修正为n=(n+1)/3。
核心代码
index = 0;
int table[3] = {0,1,-1};
while (n) {
num[index] = table[n%3];
n = (n+1)/3;
index++;
}
*/