結果

問題 No.2302 Carry X Times
ユーザー shobonvipshobonvip
提出日時 2023-05-12 22:21:13
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 3 ms / 2,000 ms
コード長 1,876 bytes
コンパイル時間 3,804 ms
コンパイル使用メモリ 265,460 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-11-28 18:49:35
合計ジャッジ時間 4,583 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 3 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 2 ms
5,248 KB
testcase_06 AC 2 ms
5,248 KB
testcase_07 AC 2 ms
5,248 KB
testcase_08 AC 2 ms
5,248 KB
testcase_09 AC 2 ms
5,248 KB
testcase_10 AC 3 ms
5,248 KB
testcase_11 AC 3 ms
5,248 KB
testcase_12 AC 3 ms
5,248 KB
testcase_13 AC 3 ms
5,248 KB
testcase_14 AC 3 ms
5,248 KB
testcase_15 AC 3 ms
5,248 KB
testcase_16 AC 2 ms
5,248 KB
testcase_17 AC 3 ms
5,248 KB
testcase_18 AC 3 ms
5,248 KB
testcase_19 AC 3 ms
6,820 KB
testcase_20 AC 3 ms
6,820 KB
testcase_21 AC 3 ms
6,820 KB
testcase_22 AC 2 ms
5,248 KB
testcase_23 AC 2 ms
5,248 KB
testcase_24 AC 2 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;

typedef modint998244353 mint;
typedef long long ll;

mint dp[20][20][4][2];

void solve(){
	ll n;
	int x;
	cin >> n >> x;
	// dp[i][j][k][l] : keta i, now kuriagari, now kakutei (4), go kuriagari
	for (int i=0; i<20; i++){
		for (int j=0; j<20; j++){
			for (int k=0; k<4; k++){
				for (int l=0; l<2; l++){
					dp[i][j][k][l] = 0;
				}
			}
		}
	}
	string ss = to_string(n);
	int siz = ss.size();
	vector<int> s(siz);
	for (int i=0; i<siz; i++){
		s[i] = ss[i] - '0';
	}
	dp[0][0][0][0] = 1;
	dp[0][0][0][1] = 1;
	for (int num=0; num<siz; num++){
		for (int mode=0; mode<4; mode++){
			int ti = 10;
			int tj = 10;
			if ((mode >> 0 & 1) == 0) ti = s[num] + 1;
			if ((mode >> 1 & 1) == 0) tj = s[num] + 1;
			for (int i=0; i<ti; i++){
				for (int j=0; j<tj; j++){
					if (i+j <= 8){
						for (int k=0; k<=x; k++){
							dp[num+1][k][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][0] += dp[num][k][mode][0];
							dp[num+1][k][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][1] += dp[num][k][mode][0];
						}
					}else if (i+j == 9){
						for (int k=0; k<=x; k++){
							dp[num+1][k][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][0] += dp[num][k][mode][0];
						}
					}
					if (i+j == 9){
						for (int k=0; k<x; k++){
							dp[num+1][k+1][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][1] += dp[num][k][mode][1];
						}
					}else if (i+j >= 10){
						for (int k=0; k<x; k++){
							dp[num+1][k+1][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][0] += dp[num][k][mode][1];
							dp[num+1][k+1][mode|((int)(s[num]>i)<<0)|((int)(s[num]>j)<<1)][1] += dp[num][k][mode][1];
						}
					}
				}
			}
		}
	}
	mint ans = 0;
	for (int i=0; i<4; i++){
		ans += dp[siz][x][i][0];
	}
	cout << ans.val() << endl;
}

int main(){
	int t; cin >> t;
	while(t--) solve();
}
0