URAL 1009|URAL 1012|URAL 1013|K-based Numbers|高精度|动态规划

来源:互联网 发布:手机三维绘图软件 编辑:程序博客网 时间:2024/05/20 16:10

URAL 1009:http://acm.timus.ru/problem.aspx?space=1&num=1009
URAL 1012:http://acm.timus.ru/problem.aspx?space=1&num=1012
URAL 1013:http://acm.timus.ru/problem.aspx?space=1&num=1013

题目

考虑K进制N位的整数。我们定义一个整数是合法的仅当K进制表示下的这个整数不包含2个连续的0,比如:
1010230 是一个合法的7位数。
1000198 不是一个合法的7位数。
0001235 不是一个7位数,实际上是4位数。
给定两个正整数N和K,计算K进制N位的整数包含多少合法的整数。
数据范围: 2K10;N2;N+K1800

题解

dpi表示最低i位的答案(第i位不为0,这样dpn就不会包含最高位为0的情况)。
那么显然第1位答案为k1,因为第i位不能取0,那么有递推方程:
dpi=(k1)dpi1+(k1)dpi2
即当前位有k1种方案,如果第i1位不为0,那么最低i1位的答案就是dpi1,否则就是1×dpi2,其中1表示第i1位填0。
然后URAL 1012 URAL 1013要高精度,上Java(不熟悉Python。。)

import java.io.*;import java.util.*;import java.math.*;import java.text.*;public class p1012 {   public static void main(String[] args) {      Scanner in = new Scanner(System.in);      PrintWriter out = new PrintWriter(System.out);      int n = in.nextInt();      int k = in.nextInt();      BigInteger dp[] = new BigInteger[n + 1];      dp[0] = BigInteger.valueOf(1);      dp[1] = BigInteger.valueOf(k - 1);      for (int i = 2; i <= n; ++i)          dp[i] = dp[i - 1].add(dp[i - 2]).multiply(dp[1]);      out.println(dp[n]);      out.flush();   }}
原创粉丝点击