概率问题&兔群繁殖之谜 | 豆包MarsCode AI刷题

119 阅读3分钟

概率问题

这道题虽然归属于难题实际上题目很简单也很容易理解,只需要将给出的概率公式化简求出即可, 最后将这个公式最终的结果可以简化成一个最简分数p/q,给出p+q的值模10的结果是多少。

解题思路:

  1. 公式化简

    • 首先,我们需要化简给定的公式:
      21​+21​(1+k2k​−1)n
    • 化简后,我们可以得到一个分数形式的结果 p/q。
  2. 计算分子和分母

    • 通过化简公式,我们可以得到分子 p 和分母 q
  3. 简化分数

    • 使用最大公约数(GCD)来简化分数 p/q
  4. 计算结果

    • 计算 p + q 的值,并对10取模,得到最终结果。

数据结构和算法

  • 数据结构

    • 使用整数来表示分子 p 和分母 q
  • 算法步骤

    1. 计算分子 p 和分母 q
    2. 使用 GCD 简化分数 p/q
    3. 计算 p + q 并对10取模,得到最终结果。

总结

通过以上步骤,我们可以计算出给定公式化简后的结果,并返回 p + q 的值模10的结果。

下面是给出的C++代码:

#include <iostream>
#include <vector>
#include <string>
#include<cmath>
using namespace std;
int solution(int n, int k) {
    // write code here
    int p=pow(k+1,n)+pow(k-1,n);
    int q=2*pow(k+1,n);
    int s=min(p,q);
    for(int i=s/2;i>1;i--)
    {
        if(p%i==0&&q%i==0)
        {
            p/=i;
            q/=i;
        }
    }
    int result=(p+q)%10;
    return result;
}

int main() {
    cout << (solution(2, 5) == 1) << endl;
    cout << (solution(2, 6) == 6) << endl;
    cout << (solution(3, 7) == 9) << endl;
    cout << (solution(3, 9) == 9) << endl;
    return 0;
}

--------------------------------这是一条分界线(●ˇ∀ˇ●)---------------------------------

兔群繁殖之谜

这道题看起来题目很长但实际上还是很简单的。

首先分析题目需要求出一共有多少只兔子,兔子的繁殖特点有以下三条:

  1. 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
  2. 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
  3. 兔子永远不会死亡。

这道题目的核心思想是是基于斐波那契数列的递推关系。

  1. 函数定义:

    • unsigned long long solution(int A) 是用来计算兔子对数的函数。
    • 函数返回类型是 unsigned long long,这表明结果可能非常大,需要处理大数。
  2. 边界条件:

    • 代码中有一个边界条件检查 if(A==1||A==2) return A;,这表明在第1个月和第2个月时,兔子对数分别是1和2。
  3. 循环逻辑:

    • 代码使用了一个循环 for(int i=3;i<=A;i++) 来计算从第3个月开始的兔子对数。
    • 在循环中,current 表示当前月份的兔子对数,prev1 和 prev2 分别表示前两个月的兔子对数。
    • 计算公式 current=prev1+prev2; 是基于斐波那契数列的递推关系。
  4. 变量更新:

    • 在每次循环中,prev2 和 prev1 被更新为前两个月的兔子对数,以便进行下一次计算。
  5. 返回值:

    • 最终返回 current,即第 A 个月的兔子对数。 下面是相应的C++代码:
unsigned long long solution(int A) {
    // Edit your code here
    if(A==1||A==2)
    return A;
    unsigned long long prev1=2;
    unsigned long long prev2=1;
    unsigned long long current=0;
    for(int i=3;i<=A;i++)
    {
        current=prev1+prev2;
        prev2=prev1;
        prev1=current;
    }
    return current;

}