输入输出样例

样例1

输入

  1. 9
  2. 26

输出

  1. 5

样例2

输入

  1. 2020
  2. 16

输出

  1. 292008622

题解一

最简单的DP,仅考虑s长为1的情况。能混32分。

  1. import java.util.Scanner;
  2. public class Main {
  3. final static private int C = 998244353;
  4. public static void main(String[] args) {
  5. final int[] TRANS = new int[] { 0, 0, 1, 0, 2, 0, 3 };
  6. Scanner scanner = new Scanner(System.in);
  7. int n = scanner.nextInt();
  8. int s = scanner.nextInt();
  9. int[][] dp = new int[n + 1][4];
  10. dp[0][0] = 1;
  11. for (int i = 1; i <= n; ++i) {
  12. dp[i][0] = dp[i - 1][2];
  13. dp[i][1] = dp[i - 1][0];
  14. dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % C;
  15. dp[i][3] = (dp[i - 1][2] + dp[i - 1][3]) % C;
  16. }
  17. System.out.println(dp[n][TRANS[s]]);
  18. }
  19. }

题解二

把S=2的情况也考虑进来,能拿64分。

编号 0 1 2 3 4 5 6 7 8 9 10 11 12 13
原数 1 2 4 6 16 26 41 42 44 46 61 62 64 66
求幂后 2 4 16 64 264 464 162 164 1616 1664 642 644 6416 6464
可以产生 2 4 16、1、6 64、6、4 26 46 62 64 61 66 42 44 41 46
  1. import java.util.Scanner;
  2. public class Main {
  3. final static private int C = 998244353;
  4. public static void main(String[] args) {
  5. final int[] NUM = new int[] { 1, 2, 4, 6, 16, 26, 41, 42, 44, 46, 61, 62, 64, 66 };
  6. Scanner scanner = new Scanner(System.in);
  7. int n = scanner.nextInt();
  8. int s = scanner.nextInt();
  9. int[][] dp = new int[n + 1][NUM.length];
  10. dp[0][0] = 1;
  11. for (int i = 1; i <= n; ++i) {
  12. dp[i][0] = dp[i - 1][2];
  13. dp[i][1] = dp[i - 1][0];
  14. dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % C;
  15. dp[i][3] = (dp[i - 1][2] + dp[i - 1][3]) % C;
  16. dp[i][4] = dp[i - 1][2];
  17. dp[i][5] = dp[i - 1][4];
  18. dp[i][6] = dp[i - 1][12];
  19. dp[i][7] = dp[i - 1][10];
  20. dp[i][8] = dp[i - 1][11];
  21. dp[i][9] = (dp[i - 1][5] + dp[i - 1][13]) % C;
  22. dp[i][10] = dp[i - 1][8];
  23. dp[i][11] = dp[i - 1][6];
  24. dp[i][12] = (dp[i - 1][3] + dp[i - 1][7]) % C;
  25. dp[i][13] = dp[i - 1][9];
  26. }
  27. for (int i = 0; i < NUM.length; ++i) {
  28. if (NUM[i] == s) {
  29. System.out.println(dp[n][i]);
  30. break;
  31. }
  32. }
  33. }
  34. }