結果
| 問題 |
No.137 貯金箱の焦り
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2021-10-29 00:20:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,027 ms / 5,000 ms |
| コード長 | 1,747 bytes |
| コンパイル時間 | 4,285 ms |
| コンパイル使用メモリ | 262,828 KB |
| 最終ジャッジ日時 | 2025-01-25 08:05:46 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#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 1000000000000000000
template <class T>
vector<T> convolution_mint(vector<T> a,vector<T> b){
static constexpr unsigned long long M0 = 998244353;
static constexpr unsigned long long M1 = 754974721;
static constexpr unsigned long long M2 = 469762049;
vector<long long> aa(a.size()),bb(b.size());
rep(i,a.size())aa[i] = a[i].val();
rep(i,b.size())bb[i] = b[i].val();
auto c0 = convolution<M0>(aa,bb);
auto c1 = convolution<M1>(aa,bb);
auto c2 = convolution<M2>(aa,bb);
vector<mint> ret(c0.size());
vector<long long> m = {M0,M1,M2};
rep(i,c0.size()){
ret[i] += c0[i];
{
long long cur = c0[i];
cur %= M1;
cur = c1[i]-cur;
if(cur<0)cur += M1;
cur *= 416537774;
cur %= M1;
mint m = M0;
ret[i] += m*cur;
cur *= M0;
cur += c0[i];
cur %= M2;
cur = c2[i] - cur;
if(cur<0)cur += M2;
cur *= 429847628;
cur %= M2;
m *= M1;
ret[i] += m * cur;
}
}
return ret;
}
int main(){
mint::set_mod(1234567891);
int n;
cin>>n;
long long m;
cin>>m;
vector<int> a(n);
rep(i,n)cin>>a[i];
vector<mint> dp(25005,0);
dp[0] = 1;
rep(i,n){
vector<mint> ndp(25005,0);
rep(j,dp.size()){
if(dp[j]==0)continue;
ndp[j] += dp[j];
ndp[j+a[i]] += dp[j];
}
swap(dp,ndp);
}
vector<mint> ddp(25005,0);
ddp[0] = 1;
while(m!=0){
vector<mint> ndp = convolution_mint(dp,ddp);
vector<mint> temp(25005,0);
rep(i,ndp.size()){
if(i%2!=m%2)continue;
temp[i>>1] = ndp[i];
}
swap(temp,ddp);
m>>=1;
}
cout<<ddp[0].val()<<endl;
return 0;
}
沙耶花