結果
| 問題 |
No.1417 100の倍数かつ正整数(2)
|
| コンテスト | |
| ユーザー |
seiyu_kyopro
|
| 提出日時 | 2021-03-06 00:03:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 39 ms / 3,000 ms |
| コード長 | 4,452 bytes |
| コンパイル時間 | 3,613 ms |
| コンパイル使用メモリ | 179,288 KB |
| 実行使用メモリ | 9,344 KB |
| 最終ジャッジ日時 | 2024-10-07 06:22:04 |
| 合計ジャッジ時間 | 2,901 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
#include <bits/stdc++.h>
#include <cstdio>
const long long MOD = 1000000007;
using namespace std;
// Nは桁数が大きい場合があるので文字列として受け取る
string N;
vector<int> n; // Nの各桁の数字を格納するベクター
long long dp[100010][2][3][3][2][2];
// i : 桁数
// smaller : 既に小さい
// j : 5が何回出てきたか
// k : 2が何回出てきたか
// l : これまでに0以外の数字が出てきたか
// m : 先頭以外で0を含むか
int main() {
cin >> N;
//ベクターnを構成
for (auto a : N) {
n.push_back(a - '0');
}
int l = N.size(); // nの長さ
dp[0][0][0][0][0][0] = 1; //初期条件。他は0で初期化されている
for (int i = 0; i < l; i++) {
for (int smaller = 0; smaller < 2; smaller++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 2; l++){
for(int m = 0; m < 2; m++){
for (int x = 0; x <= (smaller ? 9 : n[i]); x++) {
// cout << i << " " << j << " " << k << " " << l
// << " " << m << " " << endl;
if (x == 5) {
dp[i + 1][smaller || x < n[i]][min(j + 1, 2)][k][l || x != 0][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][min(j + 1, 2)][k][l || x != 0][m] %=
MOD;
} else if (x == 2) {
dp[i + 1][smaller || x < n[i]][j][min(k + 1, 2)][l || x != 0][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][min(k + 1, 2)][l || x != 0][m] %=
MOD;
} else if (x == 4) {
dp[i + 1][smaller || x < n[i]][j][min(k + 2, 2)][l || x != 0][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][min(k + 2, 2)][l || x != 0][m] %=
MOD;
}else if( x == 6) {
dp[i + 1][smaller || x < n[i]][j][min(k + 1, 2)][l || x != 0][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][min(k + 1, 2)][l || x != 0][m] %=
MOD;
}else if (x == 8) {
dp[i + 1][smaller || x < n[i]][j][min(k + 3, 2)][l || x != 0][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][min(k + 3, 2)][l || x != 0][m] %=
MOD;
} else if(x == 0) {
if(l == 1){
// out
dp[i + 1][smaller || x < n[i]][j][k][l][m || x == 0] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][k][l][m || x == 0] %= MOD;
}else{
// safe
dp[i + 1][smaller || x < n[i]][j][k][l][m] +=
dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][k][l][m] %= MOD;
}
}else{
dp[i + 1][smaller || x < n[i]][j][k][l || x != 0][m] += dp[i][smaller][j][k][l][m];
dp[i + 1][smaller || x < n[i]][j][k][l || x != 0][m] %= MOD;
}
}
}
}
}
}
}
}
long long ans = 0;
ans += (dp[l][0][2][2][1][0] + dp[l][1][2][2][1][0])%MOD;
ans %= MOD;
cout << ans << endl;
return 0;
}
seiyu_kyopro