题目:
有无限多个石头位于水平轴的非负整数位置处,一只青蛙初始位于坐标为0处的石头上,它将要往水平轴的正方向跳跃。每个非负整数位置处都有一个石头,也就是说任意两个相邻石头的距离都为1。青蛙每次跳跃会跳过k个石头(从坐标j会跳跃到坐标j+k),我们称跳跃距离为k,k的取值是[L,R]的一个随机值,也就是说对于每次跳跃,跳跃距离为[L,R]中的整数值L≤k≤R的概率为1/(R-L+1).
举个例子,若L=2,R=4,则青蛙的第一次跳跃落在位置2、3、4的概率各为1/3.
在这个问题中,青蛙会进行无数次跳跃,现在的问题是,位于坐标n的石头被青蛙踩中的概率是多少?
输入包含一行,三个整数n、L、R分别表示所求概率的坐标n,青蛙跳跃的范围[L,R].(1≤n≤1e6,1≤L≤R≤1e6)
思路:
p[x] = (p[x-R]+p[x-R-1]+…+p[x-L]) * pk那么我们只需要维护(p[x-R]+p[x-R-1]+…+p[x-L])的值就可以减少一层循环,复杂度 O(n)。
#include<bits/stdc++.h>
#define ll long long<