SRM352 div2 hard

x+yP>=minimum
(xはどの馬も勝たなかったときに入ってくるお金の期待値
yはどの馬かが勝ったときに出て行くお金の期待値(マイナスになる))
を変形して
P=(minimum-x)y
(ただしy==0かつminimum<=xなら return -2;y==0かつx

#include <vector>

#define EPS 1e-16
using namespace std;

class RaceManagement
{
	public:

		int popCount(int mask)
		{
			int r=0;
			for(int i=0;i<25;i++)
				if(mask & (1<<i))
					r++;
			return r;
		}

		double getPayoutFactor(vector<int> _p,vector<int> _a,int _m)
		{
			int n=_p.size();
			double minimum=_m;
			vector<double> probability,amount;
			for(int i=0;i<n;i++)
			{
				probability.push_back((double)_p[i]/100.0);
				amount.push_back((double)_a[i]);
			}

			double x=0.0,y=0.0;
			for(int mask=0;mask<(1<<n);mask++)
			{
				double p=1.0;
				for(int i=0;i<n;i++)
					if((1<<i) & mask)
						p*=probability[i];
					else
						p*=(1-probability[i]);

				if(popCount(mask)==1)
				{
					for(int i=0;i<n;i++)
						if((1<<i) & mask)
							y-=(p*amount[i]);
						else
							x+=(p*amount[i]);
				}
				else
				{
					for(int i=0;i<n;i++)
						x+=(p*amount[i]);
				}
			}
			
			//printf("x=%lf y=%lf\n",x,y);

			if(0.0-EPS<y && y<0.0+EPS)
				if(minimum-EPS<x)
					return -2;
				else
					return -1;
			double ans=(minimum-x)/y;
			if(ans<0.0)
				return -1;
			return ans;
		}
};