結果
問題 | No.42 貯金箱の溜息 |
ユーザー |
![]() |
提出日時 | 2021-10-27 18:13:15 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 800 ms / 5,000 ms |
コード長 | 990 bytes |
コンパイル時間 | 4,704 ms |
コンパイル使用メモリ | 256,572 KB |
最終ジャッジ日時 | 2025-01-25 07:47:25 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 |
ソースコード
#include <stdio.h>#include <bits/stdc++.h>#include <atcoder/all>using namespace atcoder;using mint = modint;using namespace std;#define rep(i,n) for (int i = 0; i < (n); ++i)#define Inf 1000000000vector<vector<mint>> a;void solve(){long long M;cin>>M;vector<mint> dp(22,0);dp[0] = 1;int c = 0;while(M!=0){vector<mint> ndp(22,0);rep(i,22){if(dp[i]==0)continue;rep(j,a[c].size()){if((i+j)%10!=M%10)continue;ndp[(i+j)/10] += dp[i] * a[c][j];}}c = min(c+1,2);swap(dp,ndp);M/=10;}cout<<dp[0].val()<<endl;}int main(){mint::set_mod(1000000009);a.resize(3);a[0].resize(55,0);rep(i,10){rep(j,10){a[0][i+j*5] ++;}}a[1].resize(109,0);rep(i,55){rep(j,55){a[1][i+j] += a[0][i] * a[0][j];}}//cout<<a[0][10].val()<<endl;a[2].resize(108 + 54 + 1,0);rep(i,109){rep(j,55){a[2][i+j] += a[0][j] * a[1][i];}}int _t;cin>>_t;rep(_,_t)solve();return 0;}