Codeforces 696 C. PLEASE

Description

三个杯子,一开始钥匙在中间,每次等概率的选择两边的两个,与中间的交换,问第 n 次选择中间的杯子是钥匙的概率是多少.

n=i=1kai,ai1018

Sol

概率DP.

首先 ai 表示在中间的概率, bi 表示不再中间的概率.

那么 ai=12bi1,bi=112bi1 .

对于 bn 数列,可以解个方程变成等比数列,然后就可以搞出来通项公式了.

bn23=12(bi123)

bn=(12)n(b023)+23

那么 an=1bn

就是 an=2n+2(1)n32n

主要是最后的那个约分比较难搞..

首先对指数用欧拉定理取膜.

上下通除一个2,在分子上乘3的逆元...

为什么这样做是对的呢...

首先除一个2肯定是没有问题的,因为分子分母都含一个2,现在来证明分子整除3

两个式子时 n 次方差公式.

anbn=(ab)(an1+an2b+an3b2+...+a2bn3+abn2bn1)

an+bn=(a+b)(an1an2b+an3b2...+a2bn3abn2+bn1),n is an odd number

n1 为奇数时

2n1+1=(2+1)(2n22n3+2n4...+1)

显然他可以整除3,同时他是个奇数,没有2的因子.

n1 为偶数时

那么 2n11 可以表示成 22x1

所以有 22x1=(41)(22x1+22x2...+1)

显然他可以整除3,同时他是个奇数,没有2的因子.

这样就完成了证明,所以直接在分子乘3的逆元即可.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
 
#define debug(a) cout<<#a<<"="<<a<<" "
typedef long long LL;
const LL p = 1000000007;
 
LL k,x;
LL _2n,a,b,f;
 
LL Pow(LL a,LL b,LL res=1){ for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;return res; }
int main(){
    ios::sync_with_stdio(false);
    cin>>k;
    _2n=1,f=1;
    for(int i=1;i<=k;i++){
        cin>>x;
        x=x%(p-1);
        _2n=(_2n*x)%(p-1);
        f&=(x&1);
    }
    _2n=Pow(2,(_2n-1+p-1)%(p-1));
    if(f) f=-1;else f=1;
     
//  debug(_2n),debug(f)<<endl;
//  debug(Pow(3,p-2))<<endl;
     
    a=(_2n+f+p)%p*Pow(3,p-2)%p;
    b=_2n%p;
    if(!a) cout<<"0/1"<<endl;
    else cout<<a<<"/"<<b<<endl;
    return 0;
}

  

posted @   北北北北屿  阅读(269)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示