Description
三个杯子,中间一个杯子初始状态有硬币,每一轮会等概率把中间的杯子和两边的杯子之一交换,问
n
轮后硬币还在中间杯子的概率,输出答案的最简分数表示
Input
第一行一整数
k
,之后输入
Output
输出 p,q
Sample Input
1
2
Sample Output
1/2
Solution
以
p[i]/q[i]
表示第
i
轮后硬币在中间杯子的概率,如果第
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
#define mod 1000000007
typedef ll M[2][2];
void Mat_Mul(M &A,M B)
{
M C;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
C[i][j]=0;
for(int k=0;k<2;k++)
C[i][j]+=A[i][k]*B[k][j];
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
A[i][j]=C[i][j]%mod;
}
void Mat_Pow(M &A,ll k)
{
M B;
B[0][0]=B[1][1]=1;
B[0][1]=B[1][0]=0;
while(k)
{
if(k&1)Mat_Mul(B,A);
Mat_Mul(A,A);
k>>=1;
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
A[i][j]=B[i][j];
}
int Pow(int a,ll b)
{
int ans=1;
while(b)
{
if(b&1)ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
b>>=1;
}
return ans;
}
int main()
{
int k;
scanf("%d",&k);
M A;
A[0][0]=mod-1,A[0][1]=1,A[1][0]=0,A[1][1]=2;
int p=1,q=2;
while(k--)
{
ll a;
scanf("%I64d",&a);
q=Pow(q,a);
Mat_Pow(A,a);
}
p=A[0][1];
q=(ll)q*(mod+1)/2%mod;
p=(q-p+mod)%mod;
printf("%d/%d\n",p,q);
return 0;
}