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;
}
每日一题题解 文章被收录于专栏

写题解

全部评论

相关推荐

09-30 20:49
湖南工学院 Java
SP小夜:举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上7点起床晚上9点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务