输入输出样例
样例1
输入
926
输出
5
样例2
输入
202016
输出
292008622
题解一
最简单的DP,仅考虑s长为1的情况。能混32分。
import java.util.Scanner;public class Main {final static private int C = 998244353;public static void main(String[] args) {final int[] TRANS = new int[] { 0, 0, 1, 0, 2, 0, 3 };Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int s = scanner.nextInt();int[][] dp = new int[n + 1][4];dp[0][0] = 1;for (int i = 1; i <= n; ++i) {dp[i][0] = dp[i - 1][2];dp[i][1] = dp[i - 1][0];dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % C;dp[i][3] = (dp[i - 1][2] + dp[i - 1][3]) % C;}System.out.println(dp[n][TRANS[s]]);}}
题解二
把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 |
import java.util.Scanner;public class Main {final static private int C = 998244353;public static void main(String[] args) {final int[] NUM = new int[] { 1, 2, 4, 6, 16, 26, 41, 42, 44, 46, 61, 62, 64, 66 };Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int s = scanner.nextInt();int[][] dp = new int[n + 1][NUM.length];dp[0][0] = 1;for (int i = 1; i <= n; ++i) {dp[i][0] = dp[i - 1][2];dp[i][1] = dp[i - 1][0];dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % C;dp[i][3] = (dp[i - 1][2] + dp[i - 1][3]) % C;dp[i][4] = dp[i - 1][2];dp[i][5] = dp[i - 1][4];dp[i][6] = dp[i - 1][12];dp[i][7] = dp[i - 1][10];dp[i][8] = dp[i - 1][11];dp[i][9] = (dp[i - 1][5] + dp[i - 1][13]) % C;dp[i][10] = dp[i - 1][8];dp[i][11] = dp[i - 1][6];dp[i][12] = (dp[i - 1][3] + dp[i - 1][7]) % C;dp[i][13] = dp[i - 1][9];}for (int i = 0; i < NUM.length; ++i) {if (NUM[i] == s) {System.out.println(dp[n][i]);break;}}}}
