TopCoder SRM 458 DIV 2
Problem 500
int n; // int aの下からn桁分のbitをdequeに入れて返す deque<int> bitDigits(int a, int dig){ deque<int> arr; for(int i=0 ; i<dig ; i++){ arr.push_front(a%2); a/=2; } return arr; } class BouncingBalls { public: double expectedBounces(vector <int> x, int T) { double result; n = x.size(); ll time = 2LL*T; double ans=0; sort(x.begin(), x.end()); for(int i=0 ; i< (1<<n) ; i++){ deque<int> d = bitDigits(i, n); int cnt=0; for(int j=0 ; j<d.size() ; j++){ int p = d[j]; int pnum = x[j]; if(p == 0){ for(int k=j-1 ; k>=0 ; k--){ if( d[k] == 1 && pnum - x[k] <= time ) cnt++; }; } else{ for(int k=j+1 ; k<d.size() ; k++){ if( d[k] == 0 && x[k] - pnum <= time ) cnt++; }; } } ans += (double)cnt/2; } return ans/(1<<n); } };
Problem 950
これ絶対950じゃねぇよ
ll calc(int x, int y1, int y2, int z1, int z2){ z1 = max(z1, x*x+1); if(z2 < z1 ) return 0; ll a1 = min( (ll)y2, (ll)floor( (double)z2/x ) ); ll a2 = max( (ll)y1, (ll)ceil( (double)z1/x ) ); a2 = max( a2, (ll)x ); return max(0LL, a1-a2+1); } class ProductTriplet { public: long long countTriplets(int minx, int maxx, int miny, int maxy, int minz, int maxz) { ll ans = 0; for(ll x=minx ; x*x < maxz && x<=maxx ; x++){ ans += calc(x, miny, maxy, minz, maxz ); } for(ll y=miny ; y*y < maxz && y<=maxy ; y++){ ans += calc(y, minx, maxx, minz, maxz ); } for(ll a = max(minx,miny) ; a*a <= maxz && a<= min(maxx, maxy) ; a++){ if(minz <= a*a) ans++; } return ans; } };