제출 #336655

#제출 시각아이디문제언어결과실행 시간메모리
336655cheeheng비스킷 담기 (IOI20_biscuits)C++14
21 / 100
1087 ms384 KiB
#include "biscuits.h" #include <bits/stdc++.h> using namespace std; long long S = 0; int k = 0; long long b[65]; long long a1[65]; bool boleh1(long long y, long long x){ for(int i = 0; i < k; i ++){ b[i] = a1[i]; } bool boleh = true; for(long long i = 0; i < x; i ++){ long long rem = y; for(int j = k-1; j >= 0; j --){ long long quotient = min(rem>>j, b[j]); b[j] -= quotient; rem -= (quotient << j); } if(rem != 0){ boleh = false; break; } } return boleh; } bool boleh2(long long y, long long x){ bool boleh = true; for(int i = 0; i < 60; i ++){ b[i] = a1[i]; } for(int i = 59; i >= 0; i --){ if( y&(1LL<<i) ){ long long rem = x<<i; for(int j = min(i, k-1); j >= 0; j --){ long long quotient = min(rem>>j, b[j]); b[j] -= quotient; rem -= (quotient << j); } if(rem != 0){ boleh = false; break; } } if(!boleh){ break; } } return boleh; } long long count_tastiness(long long x, std::vector<long long> a) { k = (int)a.size(); memset(a1, 0, sizeof(a1)); for(int i = 0; i < k; i ++){ S += (a[i]<<i); a1[i] = a[i]; } if(x == 1){ for(int i = 0; i < k; i ++){ b[i] = a[i]; } long long ans2 = 1; long long val = 0; long long mult = 1; long long divider = 1; for(int i = 0; i < k; i ++){ val += a[i]*mult; if(val >= x*(2*mult/divider - 1)*divider ){ }else{ ans2 *= 1+(val/divider); val = 0; divider = mult*2; } mult <<= 1; } ans2 *= 1+(val/divider); //printf("ans2=%lld\n", ans2); //assert(ans == ans2); return ans2; } long long ans = 1; for(long long y = 1; y <= S/x;){ bool boleh = true; for(int j = 0; j < k; j ++){ b[j] = a[j]; } long long z = y; /* for(long long i = 0; i < x; i ++){ long long rem = y; for(int j = k-1; j >= 0; j --){ long long quotient = min(rem>>j, b[j]); b[j] -= quotient; rem -= (quotient << j); } if(rem != 0){ boleh = false; break; } }*/ /* for(int i = k-1; i >= 0; i --){ if( y&(1LL<<i) ){ long long rem = x<<i; for(int j = k-1; j >= 0; j --){ long long quotient = min(rem>>j, b[j]); b[j] -= quotient; rem -= (quotient << j); } if(rem != 0){ boleh = false; break; } } if(!boleh){ break; } }*/ boleh = boleh2(y, x); //assert(boleh1(y, x) == boleh2(y, x)); //printf("y=%lld x=%lld %d %d\n", y, x, boleh1(y, x), boleh2(y, x)); if(boleh){ //printf("y=%lld works\n", y); y ++; }else{ long long lsb = y&(-y); y += lsb; y = y/lsb*lsb; } ans += boleh; } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

biscuits.cpp: In function 'long long int count_tastiness(long long int, std::vector<long long int>)':
biscuits.cpp:100:19: warning: unused variable 'z' [-Wunused-variable]
  100 |         long long z = y;
      |                   ^
#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...