题解 CF696C 【PLEASE】
推销博客
思路分享
(你绝对想不到这篇题解的思路框架是初中数学)
根据初中数学的思想,我们遇到概率问题时可以考虑画一个状态树。
设一个三元组
然后我们就可以画出状态树:
我们可以发现,这个状态数是一棵二叉树。
让我们考虑二叉树每一个节点的子结点:
-
节点
(0,1,0) 的子结点有0 个子结点是(0,1,0) -
节点
(1,0,0) 的子结点有1 个子结点是(0,1,0) -
节点
(0,0,1) 的子结点有1 个子结点是(0,1,0)
这样有什么用呢?
由于树的根节点是初始状态,所以我们设其为第
然后我们就可以求出答案:
从而得到:
最后就可以得到:
这时候我们就需要分考讨论
当
当
然后实现就很简单了。
代码展示
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int Mod=1e9+7;
int n,a,b,parity;
int power(int x,int y){
int ans=1;
while(y){
if(y&1){
ans*=x;
ans%=Mod;
}
x*=x;
x%=Mod;
y>>=1;
}
return ans;
}
signed main(){
cin>>n;
b=2;
for(int i=1;i<=n;i++){
scanf("%lld",&a);
b=power(b,a);
parity=(parity)|(a%2ll==0ll);
}
b=b*power(2,Mod-2)%Mod;
if(parity==1){
printf("%lld/%lld",((b+1)*power(3,Mod-2))%Mod,b);
}
else{
printf("%lld/%lld",((b-1+Mod)*power(3,Mod-2))%Mod,b);
}
return 0;
}