VijosP1934属于她的幸福题解

- 题目来源

https://vijos.org/tests/54baa38517f3ca7b1f7ee2bb

  • 描述
    曾几时,和木姑娘一起在独墅湖边的漫步,就成为了一个令我无限向往的梦。
    现在,这也只能永远只是梦了。木姑娘已经找到了属于她自己的幸福。
    夜晚的独墅湖边很凉,沿岸的n盏路灯将湖水圈在了光影之中。
    路灯被编号为0到n-1,围成一圈,0号路灯与n-1号路灯相邻。
    我独自坐在第0盏路灯下,却看到第x盏路灯下倚靠着的女孩。
    我想要过去找她,但是夜晚让我迷失了方向。
    每一分钟,我总会随机地走向相邻的某一柱路灯,究竟要多久才能走过去?究竟那女孩是不是木姑娘,还是我的幻境。

  • 格式
    输入格式
    第一行给定整数T( 30),表示数据组数。
    之后T行,每行给出2个整数n和x( 0x<n1000
    输出格式
    对于每一组数据,输出从0走到x期望情况下所需多少分钟,四舍五入保留到小数点后第四位。

  • 样例输入
    3
    3 2
    5 4
    10 5

  • 样例输出
    2.0000
    4.0000
    25.0000

  • 限制
    对于30%的数据,n 10;
    对于100%的数据,n 1000;

  • 题解
    本题与数学期望有关。
    我们定义 E(ξ) 表示与终点距离为 ξ 的点走到终点所需步数的期望值,那么显然有 E(0)=0
    对任意的 ξ ,考虑 ξ+1 ξ1 ,不难发现从 ξ 走到 ξ+1 或者 ξ1 其中一个的概率均为0.5,走到这两个点中任意一个所需步数期望为1,那么 E(ξ) 可由 E(ξ+1) E(ξ1) 确定。
    实际上,

    ξ=(ξ+1)+(ξ1)2
    从而
    E(ξ)=E(ξ+1)+E(ξ1)2+1

    代入 E(0)=0 ,有 E(1)=E(2)2+1 ,即 E(2)=2E(1)21 ,然后可计算得 E(3)=3E(1)32 E(4)=4E(1)43,
    最终, E(ξ)=ξE(1)ξ(ξ1)
    又因为原图呈环状,所以 E(ξ)=E(nξ) ξ=1 代入上式,有 E(ξ)=ξ(nξ) ,计算该式的时间复杂度为 O(1) ,问题解决。

  • Code

#include <cstdio>
#include <algorithm>
using namespace std;
int T, n, x;
int main()
{
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &x);
        printf("%d.0000\n", x * (n - x));
    }
    return 0;
}
7-6 特立独行的幸福 (25分) 对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8。 另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。 本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。 输入格式: 输入在第一行给出闭区间的两个端点:1<A<B≤10 ​4 ​​ 。 输出格式: 按递增顺序列出给定闭区间 [A,B] 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。 如果区间内没有幸福数,则在一行中输出 SAD。 输入样例 1: 10 40 输出样例 1: 19 8 23 6 28 3 31 4 32 3 注意:样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31 等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40] 内,所以它们在给定区间内是特立独行的幸福数。 输入样例 2: 110 120 输出样例 2: SAD
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值