鱼C论坛

 找回密码
 立即注册
查看: 3064|回复: 7

题目100:要使取到两个蓝碟子的几率是50%需要有多少个蓝碟子?

[复制链接]
发表于 2016-8-12 01:30:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Arranged probability

If a box contains twenty-one coloured discs, composed of fifteen blue discs and six red discs, and two discs were taken at random, it can be seen that the probability of taking two blue discs, QQ20160812-1@2x.png .

The next such arrangement, for which there is exactly 50% chance of taking two blue discs at random, is a box containing eighty-five blue discs and thirty-five red discs.

By finding the first arrangement to contain over QQ20160812-2@2x.png discs in total, determine the number of blue discs that the box would contain.


题目:

如果一个盒子里有 21 个有色的碟子,15 个蓝色的和 6 个红色的。从中随机取两个,可知取到两个蓝碟子的几率是 QQ20160812-1@2x.png

下一个满足此条件(即随机取两个碟子的情况下取到两个蓝色碟子的几率是 50%)的情况是 85 个蓝碟子和 35 个红碟子。

对于包含超过 QQ20160812-2@2x.png 个碟子的情况中,满足上述条件的并包含最少碟子的情况,该情况下共需要多少个蓝碟子?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-12 09:31:49 | 显示全部楼层
版主厉害,占据所有头条
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 14:22:06 | 显示全部楼层
弱弱地问一句,如何定义一个long更大的数据???百度说的long long好像不被接受。
不然那个10^12怎么描述???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-17 18:52:56 | 显示全部楼层
k329266978 发表于 2016-8-12 14:22
弱弱地问一句,如何定义一个long更大的数据???百度说的long long好像不被接受。
不然那个10^12怎么描述 ...

百度都差不多是过时的代名词了,C99:

搜狗截图20160817185218.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-21 11:50:11 | 显示全部楼层
因为10**12的数字量太大了,暴力破解肯定行不通。这样就要从其他方面着手。
然后我发现了很有趣的解法“找规律”:
首先根据题设,写函数,找出前几个符合条件的解:
import math
def func(t):
        tb = (1+math.sqrt(2*t*t-2*t+1))
        if tb % 2 == 0:
                return int(float(tb)/2)
        else:
                return False

print "(blue,red,total)"
t = 3
b = func(t)
while t < 100000:
        while b == False:
                t+=1
                b = func(t)
        print (b,t-b,t)
        t+=1
        b = func(t)
得到结果:
(blue,red,total)
(3, 1, 4)
(15, 6, 21)
(85, 35, 120)
(493, 204, 697)
(2871, 1189, 4060)
(16731, 6930, 23661)
(97513, 40391, 137904)
[Finished in 0.2s]
通过观察前几项,可以发现:
1. 红盘子red符合递归:red(n)=6*red(n-1)-red(n-2) 【red(0)=0,red(1)=1】
2. 总盘子total符合递归:total(n)=6*total(n-1)-total(n-2)-2 【total(0)=1,total(1)=4】
有了这2个递推关系,就可以写递推关系式了。
def digui(t):
        red = [0,1]
        total = [1,4]
        while total[-1] < t:
                red.append(6*red[-1]-red[-2])
                total.append(6*total[-1]-total[-2]-2)
        print "blue: " + str(total[-1]-red[-1])

digui(10**12)

结果:
blue: 756872327473
[Finished in 0.1s]
轻松搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-21 13:47:25 | 显示全部楼层
顺利解决欧拉计划前100题,自己庆贺一下!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-1-20 13:45:40 From FishC Mobile | 显示全部楼层
本质上是解二元二次不定方程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-28 22:44:40 | 显示全部楼层
本帖最后由 guosl 于 2022-1-28 22:49 编辑

本题是求方程a(a-1)/((a+b)(a+b-1)=1/2的a+b>=1000000000000的最小整数解。
整理方程得a^2-(2b+1)a-(b^2-b)=0,
根据二次方程的求根公式得:
a=(y+x+1)/2,其中y=2b,x^2=2y^2+1,由于a,b都是整数故x,y也都是整数,从而x,y满足
Pell方程x^2 - 2 y^2 = 1,这个方程的最小正整数解是x(1)=3,y(1)=2
这个方程的一般递推解如下:(具体参照数论中的Pell方程的通解)
x(n)=x(1)*x(n-1)+2*y(1)*y(n-1)
y(n)=y(1)*x(n-1)+x(1)*y(n-1)
我们可以逐步求出x(n)和y(n)进而获得a和b。
/*
答案:756872327473
*/
#include <iostream>
using namespace std;

const long long N = 1000000000000LL;

int main(void)
{
  long long x1 = 3, x2, y1 = 2, y2;
  while (true)
  {
    x2 = 3 * x1 + 4 * y1;
    y2 = 2 * x1 + 3 * y1;
    long long b = y2 / 2;
    long long a = y2 + x2 + 1;
    a = a / 2;
    if (a + b >= N)
    {
      cout << a << endl;
      break;
    }
    x1 = x2;
    y1 = y2;
  }
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 21:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表