結果
| 問題 |
No.137 貯金箱の焦り
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-05-03 11:14:24 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 266 ms / 5,000 ms |
| コード長 | 1,789 bytes |
| コンパイル時間 | 1,748 ms |
| コンパイル使用メモリ | 168,872 KB |
| 実行使用メモリ | 29,384 KB |
| 最終ジャッジ日時 | 2024-11-21 16:55:56 |
| 合計ジャッジ時間 | 4,176 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
// Problem: No.137 貯金箱の焦り
// Contest: yukicoder
// URL: https://yukicoder.me/problems/no/137
// Memory Limit: 512 MB
// Time Limit: 5000 ms
/*
hxz还是爬的好
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(ll i=a;i<=b;i++)
#define wt int tt=d;while(tt--)
#define py puts("Yes")
#define pn puts("No")
#define pritnf printf
#define edfl endl
#define fe(i,e) for(int i=0;i<e.size();i++)
#define vi vector<ll>
inline ll rd() {
ll x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c))x=x*10+c-'0',c=getchar();
return x*f;
}
namespace binom{
const ll Lim=300010,mod=998244353;
ll jc[Lim],inv[Lim],inc[Lim];
void pre(){
jc[0]=jc[1]=inc[0]=inc[1]=inv[0]=inv[1]=1;
f(i,2,Lim-1)jc[i]=jc[i-1]*i%mod,inv[i]=(mod-mod/i)*inv[mod%i]%mod,
inc[i]=inc[i-1]*inv[i]%mod;
}ll C(ll n,ll m){if(n<0||m<0||n<m)return 0;return jc[n]*inc[m]%mod*inc[n-m]%mod;}
}
// using namespace binom;
ll dx[4]={0,1,0,-1};
ll dy[4]={1,0,-1,0};
#define d rd()
#define pb push_back
const ll N=300010;
struct edge{ll v,w,nx;}e[N<<1];
ll hd[N],cnt;
void add(ll u,ll v,ll w){e[++cnt]=(edge){v,w,hd[u]};hd[u]=cnt;}
ll qp(ll a,ll b,ll p){
ll ans=1;while(b){
if(b&1)ans=ans*a%p;
a=a*a%p;b>>=1;
}return ans;
}ll n,m;
ll dp[110][50010];//前 i-1 位与m相同,第i位及以上的值=j 的方案数
ll a[510],s;
const ll mod=1234567891;
int main(){
n=d,m=d;
f(i,1,n)a[i]=d,s+=a[i];dp[0][0]=1;
f(i,1,n)for(int j=2*s-a[i];j>=0;j--)dp[0][j+a[i]]=(dp[0][j+a[i]]+dp[0][j])%mod;
f(bit,1,63){
f(i,0,2*s)if((i&1)==((m>>(bit-1))&1))dp[bit][i>>1]=(dp[bit][i>>1]+dp[bit-1][i])%mod;
f(i,1,n)for(int j=2*s-a[i];j>=0;j--)dp[bit][j+a[i]]=(dp[bit][j+a[i]]+dp[bit][j])%mod;
}cout<<dp[63][0];
return 0;
}
/*
wy还是爬的好
*/