제출 #1032732

#제출 시각아이디문제언어결과실행 시간메모리
103273212345678Packing Biscuits (IOI20_biscuits)C++17
21 / 100
1068 ms600 KiB
#include "biscuits.h" #include <bits/stdc++.h> using namespace std; #define ll long long ll n=70, dp[3][70]; long long count_tastiness2(long long x, std::vector<long long> a) { ll sm=0, k=min(17ll, (ll)a.size()), res=0; for (int i=0; i<k; i++) sm+=(1<<i)*a[i]; for (int y=1; y*x<=sm; y++) { vector<ll> cnt=a; for (int t=0; t<x; t++) { ll tmp=y, vl; for (int i=k-1; i>=0; i--) { if ((1<<i)>tmp) continue; if ((1<<i)*cnt[i]<=tmp) tmp-=(1<<i)*cnt[i], cnt[i]=0; else vl=tmp/(1<<i), tmp-=(1<<i)*vl, cnt[i]-=vl; } if (tmp!=0) break; if (t==x-1) res++; } } return res+1; } long long count_tastiness(long long x, std::vector<long long> a) { if (x!=1) return count_tastiness2(x, a); ll k=a.size(); vector<ll> cnt(70); for (int i=0; i<k; i++) cnt[i]=a[i]; for (int i=0; i<70; i++) dp[0][i]=dp[1][i]=dp[2][i]=0; for (int i=0; i<70; i++) if (cnt[i]>2) cnt[i+1]+=(cnt[i]-1)/2, cnt[i]-=2*((cnt[i]-1)/2); //for (int i=0; i<10; i++) cout<<i<<' '<<cnt[i]<<'\n'; for (int i=0; i<70; i++) { if (i==0) for (int j=0; j<=cnt[i]; j++) dp[j][i]=1; else { if (cnt[i]==0) dp[0][i]=dp[0][i-1]+dp[1][i-1]+dp[2][i-1]; else if (cnt[i]==1) dp[0][i]=dp[0][i-1]+dp[1][i-1], dp[1][i]=dp[0][i-1]+dp[1][i-1], dp[2][i]=dp[2][i-1]; else dp[0][i]=dp[0][i-1]+dp[1][i-1], dp[1][i]=dp[0][i-1]+dp[1][i-1], dp[2][i]=dp[0][i-1]+dp[1][i-1]+dp[2][i-1]; } //cout<<"debug "<<i<<' '<<dp[0][i]<<' '<<dp[1][i]<<' '<<dp[2][i]<<'\n'; } return dp[0][69]+dp[1][69]+dp[2][69]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...