Submission #557128

#TimeUsernameProblemLanguageResultExecution timeMemory
557128new_accMagneti (COCI21_magneti)C++14
110 / 110
802 ms64372 KiB
#include<bits/stdc++.h> #define fi first #define se second #define pitem item* using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<ll> vl; const int N=50+10; const int SS=1<<19; const int INFi=2e9; const ll INFl=1e13; const ll mod2=998244353; const ll mod=1e9+7; const ll mod3=1000696969; const ll p=70032301; const ull p2=913; const int L=20; int t[N]; ll dp1[N][10*1000+10][2][2],dp2[N][10*1000+10][2][2],sp1[N][10*1000+10][2][2],sp2[N][10*1000+10][2][2]; void solve(){ int n,nk; cin>>n>>nk; for(int i=1;i<=n;t[i]--,i++) cin>>t[i]; if(1==n){ cout<<nk<<"\n"; return; } sort(t+1,t+1+n); int akt=0; for(int i=1;i<=n;i++) akt+=t[i]+1; dp1[0][0][1][1]=1; for(int i=1;i<=n;i++){ akt-=(t[i]+1); int k=nk; for(int i2=0;i2<=i;i2++){ for(int k1=0;k1<2;k1++) for(int k2=0;k2<2;k2++){ sp1[i2][0][k1][k2]=dp1[i2][0][k1][k2]; for(int sum=1;sum<=k;sum++) (sp1[i2][sum][k1][k2]=sp1[i2][sum-1][k1][k2]+dp1[i2][sum][k1][k2])%=mod; ll curr=dp1[i2][0][k1][k2]; sp2[i2][0][k1][k2]=dp1[i2][0][k1][k2]; for(int sum=1;sum<=k;sum++) (curr+=dp1[i2][sum][k1][k2])%=mod,(sp2[i2][sum][k1][k2]=sp2[i2][sum-1][k1][k2]+curr)%=mod; } } //nowa spojna for(int i2=1;i2<=i;i2++){ for(int sum=1;sum<=k;sum++){ (dp2[i2][sum][0][0]=dp1[i2-1][sum-1][0][0]*(ll)(i2-2)+sp1[i2-1][sum-1][1][0]+sp1[i2-1][sum-1][0][1]); (dp2[i2][sum][1][0]=dp1[i2-1][sum-1][1][0]*(ll)(i2-1)+sp1[i2-1][sum-1][1][1]); (dp2[i2][sum][1][1]=dp1[i2-1][sum-1][1][1]*(ll)(i2)); (dp2[i2][sum][0][1]=dp1[i2-1][sum-1][0][1]*(ll)(i2-1)+sp1[i2-1][sum-1][1][1]); } } //na koniec spojnej for(int i2=1;i2<=i;i2++){ for(int sum=t[i]+1;sum<=k;sum++){ for(int k1=0;k1<2;k1++) for(int k2=0;k2<2;k2++){ (dp2[i2][sum][k1][k2]+=sp1[i2][sum-t[i]-1][k1][k2]*(ll)(i2*2-(k1^1)-(k2^1))); if(!k1) (dp2[i2][sum][k1][k2]+=sp2[i2][sum-t[i]-1][1][k2]); if(!k2) (dp2[i2][sum][k1][k2]+=sp2[i2][sum-t[i]-1][k1][1]); } } } //laczenie spojnych for(int i2=1;i2<i;i2++){ for(int sum=(t[i]<<1)+1;sum<=k;sum++){ for(int k1=0;k1<2;k1++) for(int k2=0;k2<2;k2++){ (dp2[i2][sum][k1][k2]+=sp2[i2+1][sum-(t[i]<<1)-1][k1][k2]*(ll)(i2)); } } } for(int i2=0;i2<=i;i2++){ for(int sum=0;sum<=k;sum++){ for(int k1=0;k1<2;k1++) for(int k2=0;k2<2;k2++){ dp1[i2][sum][k1][k2]=dp2[i2][sum][k1][k2]%mod; dp2[i2][sum][k1][k2]=0; } } } } cout<<dp1[1][nk][0][0]<<"\n"; } int main(){ ios_base::sync_with_stdio(0),cin.tie(0); int tt=1; while(tt--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...