PLEASE

PLEASE

https://ac.nowcoder.com/acm/problem/111563

题意:
有这么一个游戏,有三个杯子,每次可以使用中间的杯子与二边的交换,求n次交换后中间杯子还是原来那个的概率为多少?

思路:
设原来杯子用1表示,其余二个杯子用0表示:010为初始状况
第一次出现状态为:100、001
第二次出现状态为:100、010、010、001
第三次出现状态为:100、010、100、001、100、001、010、001
每一个状态可以演化成两个状态,所以第n次的总状态数为图片说明
由于010只由100、001一比一演化出,所以设图片说明 (当前次的010状态数等于上一次的总状态数减去上一次的010状态数)
第n次概率:图片说明
用高中知识去掉右边表达式的常数:
图片说明
设:图片说明
所以:图片说明
图片说明
代回去得:
图片说明
最后n为奇数为:
图片说明
最后n为偶数为:
图片说明
我们发现分子一定为奇数,所以不会有2的因子,所以只需要考虑分子能不能被3整除,带几个n进去发现可以都整除3。
所以分子需要将分母的3除去。

参考:
https://blog.nowcoder.net/n/3d7a321601c845d5bfb99f469f5405c4
https://blog.nowcoder.net/n/fc44ba68be8444a7b6c4189f2b253457

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf=1e9+7;
const int N=200005;

ll qpow(ll n, ll m)
{
    ll s=1;
    while(m)
    {
        if(m&1)
        {
            s=s*n%inf;
        }
        n=n*n%inf;
        m=m/2;
    }
    return s;
}

int main()
{
    int k;
    scanf("%d",&k);
    ll p=2;
    int flag=1;
    for(int i=0;i<k;i++)
    {
        ll a;
        scanf("%lld",&a);
        p=qpow(p,a);
        if(a%2==0)
        {
            flag=0;
        }
    }
    p=p*qpow(2LL,inf-2)%inf;
    ll ki=qpow(3LL,inf-2);
    if(flag)
    {
        printf("%lld/%lld\n",(p-1+inf)%inf*ki%inf,p);
    }
    else
    {
        printf("%lld/%lld\n",(p+1)%inf*ki%inf,p);
    }
    return 0;
}
每日一题题解 文章被收录于专栏

写题解

全部评论

相关推荐

10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务