【数论】争夺基友

                     争夺基友争夺基友 (friend.pas/c/cpp) 
                     争夺基友争夺基友 


 【问题描述】 
    小宸和小松都很想和乐乐在一起,但是乐乐说他只需要一个基友。于是小宸和小松决定 
用抛掷硬币的方式来决定谁能成为乐乐的基友。 
    游戏共有n 局,规则如下:一人先掷,如果掷得正面,则此人获胜,如果是反面则由另 
外一人掷,如此交替,直到第一次抛出正面时本局结束,掷得正面者获胜。下一局则由未获 
胜的人先掷,规则同上。 
    由于小宸希望成为乐乐基友的愿望非常强烈,于是找到了聪明的你,请你告诉他,小宸 
在第n 局恰好获胜的概率是多少。另外他还告诉你,第一局是由小宸先掷。 


 【输入数据】 
一个整数n,含义如题目描述。 


 【输出数据】 
一个最简分数,形如a/b,表示小宸在第n 局恰好获胜的概率。 


 【样例输入】 



 【样例输出】 
4/9 


 【数据范围及约定】 
对于50%    的数据:1≤n≤16; 

对于100%的数据:1≤n≤32。 



这套题是以我们机房为背景出的。

这道题我推公式推到一半。。导致分数也是一半。。

等比数列求和公式求极限可以得出第一轮lcy获胜的几率是2/3。

然后第i局lcy获胜的几率P[i]=P[i-1]*1/3+(1-P[i-1])*2/3。

可以推出通项公式是P[n] = 1/6*(-1/3)^(n-1)+1/2。再加上快速幂就可以秒过

#include <cmath>
#include <cstdio>
#include <iostream>
#include <cstdlib>


inline long long min(long long &a,long long &b)
{
    if (a > b)
        return a;
    else return b;
}


long long kysumi(long a,long b)
{
    long long ans = 1;
    long long y = a;
    while (b>0)
    {
        if (b&1==1)
        {
            ans *= y;
        }
        y *= y;
        b >>= 1;
    }
    return ans;
}


long long kgcd(long long a,	long long b)
{
    while (b)
    {
        long long c = a%b;
        a = b;
        b = c;
    }
    return a;
}


int main()
{
    freopen("friend.in","r",stdin);
    freopen("friend.out","w",stdout);
    long n;
    std::cin >>n;


    long long thr = kysumi(3,n-1);
    if ((n&1)==0)
        thr = -thr;
    long long fm = thr*6*2;
    long long fz = thr*6+2;


    long long g = kgcd(fm,fz);
    std::cout << fz/g << "/" << fm/g;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值