考试结束啦,为暑期集训热身一下解题报告

热身赛(中奖啦!,:Fibonacci II,找新朋友)题解!!-by ahmasoi

A:中奖啦!

不好意思本人中奖了,现在来与大家一起分享中奖的经验!!

本题的思路是递归:

(1)当N=1时,显然直接输出1即可;

(2)当N>1时,先选一个,这种概率不要我说是100%啦!!,然后呢:还剩的卡片数是M-1,还需要选择N-1类,由此俺的递归过程就定义为f(x, y){其中x表示剩余的卡片数量,初始就是m-1,y表示还需要选择几类,初始为n-1}

(3)当进入下一层递归里,就不第1次所那样100%了,显然需要再选择不是第1次选择的那个数的概率为(y/n),所以这一部分的递归则为:(y/n) * f(x - 1, y -1){表示卡片少一张,还需要的类别也少了一个};当然还有一个不幸的情况就是第2次你的小片片与第1张(即前面已出现的类别)一样(太不幸了),这种几率是多少呢?显然是(n-y)/n,在这种情况下,递归则有:((n-y)/n)*f(x - 1, y){卡片少一张,可类别没增加,所以还需要那么多类别},综上所述所以有递归式为:
     f(x, y) = y / n * f(x - 1, y - 1) + (n-y) / n * f(x - 1, y);

(4)边界条件为:
      1.当x < y显然,你没机会中奖了,直接返回0
      2.当y=0显然不需要再选了,100%(返回值为1)

匆忙中,也许有没说清的地方,敬请谅解!大家也可以按此想法改成递推算法!由于考试时间紧张,还有数据了较小,就没有细化了!!!愿对大家有所帮助!!

D:Fibonacci II

    本题,偶是在考试结束才有时间去想的!

    在这里我感觉是递归递推都会超时,所以就想到用数学公式,f[n] = (((1 + sqrt(5))/2)^n - ((1-sqrt(5))/2)^n)/sqrt(5)(好复杂的公式啊!!!)

    这个公式有用吗?它不可能准确得到第N项的值啊,呵呵!!好在要输出的是前4项,不管怎么算,这个公式用电脑算出的精确不能保证后面的,但还是能保证前面几位的精确性,所以………嘿嘿!!

    不过就是用这个公式也还得处理,当N较大时,直接用公式算出的值会溢出!!必须再处理!!还是那句话,好在题目要求我们输出的是前4位,所以我就想办法把算出的结果死掐在1的附近!!方法就是用n*ln((1 + sqrt(5))/2),估算出位数,然后就除以10的这么多次方啦!具体做法如下:

    {   t := sqrt(5);        t1 := ln((1 + t)/2);    t2 := ln((t - 1)/2);     k := ln(10);    }

      x := trunc(n * t1 / k);           //估算出该数的位数
      s := exp(n * t1 - x * k);       //计算出来的结果保证在1附近,不会溢出啦!
      if odd(n) then                    //原式这部分为((1 - sqrt(5))/2) ^N,由于ln不受理负数,所以……
        s := s + exp(n * t2 - x * k)
      else
        s := s - exp(n * t2 - x * k);
      s := s / t;
      while s < 1000 do            //还原成4位整数部分
        s := s * 10;
      这样就能求出前4位(精确的哦),只要输出s的整数部分即可!

      希望这个想法能对大家有所帮助!!

      (附:0~16个这前17项是不超过4位的,我……打表啦!!)
 

E:找新朋友

    这个题上面的MM(主人已确认!)已经说了,在这里就不多说,主要是求素数因子和容斥原理,与1006题思路基本一致!!还有第3653题“第K互素数

 

希望大家顶啊顶!!!!再次感谢大家!!

 


为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.