結果
| 問題 |
No.137 貯金箱の焦り
|
| ユーザー |
|
| 提出日時 | 2022-07-29 19:36:48 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 62 ms / 5,000 ms |
| コード長 | 851 bytes |
| コンパイル時間 | 1,221 ms |
| コンパイル使用メモリ | 73,896 KB |
| 最終ジャッジ日時 | 2025-01-30 14:56:07 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#pragma GCC optimize ("O3")
#pragma GCC target ("avx,avx2")
#include <iostream>
using i32 = int;
using u64 = unsigned long long int;
constexpr i32 mod = 1234567891;
i32 A[100];
i32 num[2*50*500];
int main(){
i32 n;
u64 m;
std::cin >> n >> m;
i32 sum = 0;
for(i32 i = 0; i < n; i++){
std::cin >> A[i];
sum += A[i];
}
num[0] = 1;
i32 deg = 0;
for(; m; m >>= 1){
for(i32 j = 0; j < n; j++){
if(A[j] & 1){
deg += A[j];
for(i32 i = deg; i >= A[j]; i--){
num[i] += num[i-A[j]] - mod;
if(num[i] < 0) num[i] += mod;
}
}
else A[j] >>= 1;
}
for(i32 i = 0; i <= (deg - (i32) (m&1))/2; i++) num[i] = num[(i << 1) | (m & 1)];
for(i32 i = (deg-(m&1))/2 + 1; i <= deg; i++) num[i] = 0;
deg = (deg - (m&1))/2;
}
printf("%u\n", num[0]);
return 0;
}