概率问题
这道题虽然归属于难题实际上题目很简单也很容易理解,只需要将给出的概率公式化简求出即可, 最后将这个公式最终的结果可以简化成一个最简分数p/q,给出p+q的值模10的结果是多少。
解题思路:
-
公式化简:
- 首先,我们需要化简给定的公式:
21+21(1+k2k−1)n - 化简后,我们可以得到一个分数形式的结果 p/q。
- 首先,我们需要化简给定的公式:
-
计算分子和分母:
- 通过化简公式,我们可以得到分子
p和分母q。
- 通过化简公式,我们可以得到分子
-
简化分数:
- 使用最大公约数(GCD)来简化分数
p/q。
- 使用最大公约数(GCD)来简化分数
-
计算结果:
- 计算
p + q的值,并对10取模,得到最终结果。
- 计算
数据结构和算法
-
数据结构:
- 使用整数来表示分子
p和分母q。
- 使用整数来表示分子
-
算法步骤:
- 计算分子
p和分母q。 - 使用 GCD 简化分数
p/q。 - 计算
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;
}
--------------------------------这是一条分界线(●ˇ∀ˇ●)---------------------------------
兔群繁殖之谜
这道题看起来题目很长但实际上还是很简单的。
首先分析题目需要求出一共有多少只兔子,兔子的繁殖特点有以下三条:
- 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
- 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
- 兔子永远不会死亡。
这道题目的核心思想是是基于斐波那契数列的递推关系。
-
函数定义:
unsigned long long solution(int A)是用来计算兔子对数的函数。- 函数返回类型是
unsigned long long,这表明结果可能非常大,需要处理大数。
-
边界条件:
- 代码中有一个边界条件检查
if(A==1||A==2) return A;,这表明在第1个月和第2个月时,兔子对数分别是1和2。
- 代码中有一个边界条件检查
-
循环逻辑:
- 代码使用了一个循环
for(int i=3;i<=A;i++)来计算从第3个月开始的兔子对数。 - 在循环中,
current表示当前月份的兔子对数,prev1和prev2分别表示前两个月的兔子对数。 - 计算公式
current=prev1+prev2;是基于斐波那契数列的递推关系。
- 代码使用了一个循环
-
变量更新:
- 在每次循环中,
prev2和prev1被更新为前两个月的兔子对数,以便进行下一次计算。
- 在每次循环中,
-
返回值:
- 最终返回
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;
}