結果
問題 |
No.1085 桁和の桁和
|
ユーザー |
|
提出日時 | 2025-08-01 17:57:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,177 bytes |
コンパイル時間 | 2,179 ms |
コンパイル使用メモリ | 195,884 KB |
実行使用メモリ | 24,040 KB |
最終ジャッジ日時 | 2025-08-01 17:58:07 |
合計ジャッジ時間 | 8,824 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | TLE * 1 -- * 34 |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> Pii; typedef pair<int, ll> Pil; typedef pair<ll, ll> Pll; typedef pair<ll, int> Pli; typedef vector<vector<ll>> Mat; #define fi first #define se second const ll MOD = 1e9 + 7; const ll MOD2 = 998244353; const ll MOD3 = 1812447359; const ll INF = 1ll << 62; const double PI = 2 * asin(1); void yes() { printf("yes\n"); } void no() { printf("no\n"); } void Yes() { printf("Yes\n"); } void No() { printf("No\n"); } void YES() { printf("YES\n"); } void NO() { printf("NO\n"); } ll my_pow(ll a, ll n, ll mod) { if (n == 0) { return 1; } else if (n % 2 == 0) { return my_pow(a * a % mod, n / 2, mod); } else { return a * my_pow(a, n - 1, mod) % mod; } } string t; int d; ll ans, cnt, now[10], fac[int(1e6 + 5)], rev[int(1e6 + 5)]; int result[int(1e6 + 5)]; bool visited[int(1e6 + 5)]; int calc(int idx) { if (visited[idx]) { return result[idx]; } visited[idx] = true; if (idx <= 9) { return result[idx] = idx; } int sum = 0, rest = idx; while (rest > 0) { sum += rest % 10; rest /= 10; } return result[idx] = calc(sum); } void prepare() { for (int i = 0; i <= int(1e6); i++) { calc(i); } fac[0] = 1; for (ll i = 1; i <= int(1e6); i++) { fac[i] = fac[i - 1] * i % MOD; } for (ll i = 0; i <= int(1e6); i++) { rev[i] = my_pow(fac[i], MOD - 2, MOD); } return; } void solve(int idx, int rest, int sum) { if (idx == 9) { if (calc(sum + 9 * rest) == d) { now[idx] = rest; ll tmp = fac[cnt]; for (int i = 0; i <= 9; i++) { tmp = tmp * rev[now[i]] % MOD; } ans = (ans + tmp) % MOD; now[idx] = 0; return; } else { return; } } for (int i = 0; i <= rest; i++) { now[idx] = i; solve(idx + 1, rest - i, sum + idx * i); now[idx] = 0; } return; } int main() { prepare(); cin >> t; cin >> d; int sum = 0; for (int i = 0; i < t.length(); i++) { if (t[i] == '?') { cnt++; } else { sum += t[i] - '0'; } } solve(0, cnt, sum); cout << ans << endl; return 0; }