Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 1530 | Accepted: 538 |
Description
Input
Output
Sample Input
3 60
Sample Output
1313
Source
/*
第一次在POJ上用JAVA提交程序,一开始用自己写的大数运算工具库做的,结果TLE,后来转用JAVA的BIG INTEGER就过了
看来自己写的那个大数运算工具还是只适合做工程,不适合来做ACM的题啊。下面分别给出C++(TLE)和JAVA(ACCPET)版本
其实思路很简单:
对于U串[Un, Un-1, Un-2, ..., U1]其对应的V串是[Un + 1, Un-1 + 1, Un-2 + 1,..., U1 + 1]即在每一个U串元素的基础上+1
那么U串的X值和V串的X值是什么关系呢? xV = Bn * (Un + 1) + Bn-1 * (Un-1 + 1) + Bn-2 * (Un-2 + 1) +... + B1 * (U1 + 1)
其中Bn = base ^ (n - 1). 则xV = xU + Bn + Bn-1 + Bn-2 + ... + B1,所以可以基于以下步骤通过间接求U串来求解V串:
1)将输入x迭代减去bi,当bi > x时退出,此时剩下的x为U的x值,并记录下迭代的步骤len,len即为V串的长度
2)利用10进制转base进制的方法在1)中x的基础上求U串
3)2)中出的U串的长度l很可能小于Len,则在U串前面补齐Len - l个0
4)一次输出U串元素+1即为V串
*/
import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger base = null, input = null;
BigInteger zero = BigInteger.valueOf(0);
String res = "";
while(cin.hasNextBigInteger())
{
base = cin.nextBigInteger();
input = cin.nextBigInteger();
if(input.compareTo(zero) == 0) continue;
//System.out.println("hell0");
BigInteger cur = BigInteger.valueOf(1);
int len = 0;
while(input.compareTo(cur) >= 0)
{
len++;
input = input.subtract(cur);
cur = cur.multiply(base);
}
res = "";
BigInteger residual = null;
BigInteger quotient = null;
while(input.compareTo(zero) != 0)
{
quotient = input.divide(base);
residual = input.mod(base);
input = quotient;
res = residual.toString() + res;
}
int l = res.length();
while(l < len)
{
res = "0" + res;
l++;
}
for(l = 0; l < res.length(); l++)
System.out.print((char)(res.charAt(l) + 1));
}
}
}