結果

問題 No.362 門松ナンバー
ユーザー tnakao0123
提出日時 2016-04-18 20:25:14
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 2 ms / 3,000 ms
コード長 2,565 bytes
コンパイル時間 672 ms
コンパイル使用メモリ 85,556 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-10-04 13:55:21
合計ジャッジ時間 1,256 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 19
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

/* -*- coding: utf-8 -*-
*
* 362.cc: No.362 - yukicoder
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
using namespace std;
/* constant */
const int MAX_N = 15;
typedef long long ll;
const ll MAX_K = 10000000000;
/* typedef */
typedef vector<int> vi;
typedef queue<int> qi;
typedef pair<int,int> pii;
/* global variables */
ll dp[MAX_N + 1][10][10], dsum[MAX_N + 1], dns[MAX_N + 1][10];
/* subroutines */
/* main */
int main() {
for (int d0 = 0; d0 <= 9; d0++)
for (int d1 = 0; d1 <= 9; d1++)
if (d0 != d1) dp[2][d0][d1] = 1;
for (int n = 2; n < MAX_N; n++) {
for (int d0 = 0; d0 <= 9; d0++)
for (int d1 = 0; d1 <= 9; d1++) {
if (dp[n][d0][d1] > 0) {
ll &dp0 = dp[n][d0][d1];
for (int d2 = 0; d2 <= 9; d2++)
if (d0 != d2 && ((d0 > d1 && d1 < d2) || (d0 < d1 && d1 > d2)))
dp[n + 1][d1][d2] += dp0;
}
else if (dp[n][d0][d1] < 0)
printf("dp[%d][%d][%d]=%lld\n", n, d0, d1, dp[n][d0][d1]);
}
for (int d0 = 0; d0 <= 9; d0++)
for (int d1 = 0; d1 <= 9; d1++) dns[n][d1] += dp[n][d0][d1];
for (int d0 = 1; d0 <= 9; d0++) dsum[n] += dns[n][d0];
//printf("dsum[%d]=%lld\n", n, dsum[n]);
if (dsum[n] > MAX_K) break;
}
int tn;
cin >> tn;
while (tn--) {
ll k;
cin >> k;
k--;
int l = 3;
while (k >= dsum[l]) k-= dsum[l++];
//printf("k=%lld, l=%d\n", k, l);
ll ans = 0;
int pd0 = -1, pd1 = -1;
for (int d = 1; d <= 9; d++) {
if (dns[l][d] <= k) k -= dns[l][d];
else {
ans = pd0 = d;
break;
}
}
//printf("pd0=%d, k=%lld\n", pd0, k);
for (int d = 0; d <= 9; d++) {
ll &dp0 = dp[l][d][pd0];
if (dp0 <= k) k -= dp0;
else {
ans = ans * 10 + d;
pd1 = pd0;
pd0 = d;
break;
}
}
//printf("pd0=%d, pd1=%d, k=%lld\n", pd0, pd1, k);
for (int i = l - 1; i >= 2; i--) {
//printf(" i=%d: ans=%lld, pd0=%d, pd1=%d, k=%lld\n", i, ans, pd0, pd1, k);
for (int d = 0; d <= 9; d++)
if (pd1 != d && ((pd1 < pd0 && pd0 > d) || (pd1 > pd0 && pd0 < d))) {
ll &dp0 = dp[i][d][pd0];
if (dp0 <= k) k -= dp0;
else {
ans = ans * 10 + d;
pd1 = pd0;
pd0 = d;
break;
}
}
}
//printf("ans=%lld, k=%lld\n", ans, k);
printf("%lld\n", ans);
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0