Using the information theory, **we needn't to know which pig needs to drink which bucket**, the only thing we need to do is **get enough information to make sure the bucket is the poison bucket**.

First, according to the information theory, if we want to know which bucket is poison, we should have information at least:

**poisonInfo = Math.log(buckets, 2)**

For one pig, the attempts of it is:

**t = minutesToTest // minutesToDie**

That's mean, we can do t attempts to a pig.

**But, we can only have t+1 results of the t attempts, because that the pig can only die one time.**

The pig didn't die, died at the first attempt, died at the second attempt.....

So, the ammound of information we can get the from this pig is:

**pigInfo = math.log(t + 1, 2)**

So, we need n pigs to get the information which needs to be bigger than the poisonInfo, the result is:

**n = int(math.ceil(posionInfo / pigInfo))**

So the code is:

```
def poorPigs(self, buckets, minutesToDie, minutesToTest):
#the information of the posion bucket
posionInfo = math.log(buckets, 2)
#the information that we can get from a pig
pigInfo = math.log(minutesToTest // minutesToDie + 1, 2)
#so,the result..
return int(math.ceil(posionInfo / pigInfo))
```