传送门:点击打开链接 (数论)
题意:
三个杯子,硬币一开始在中间的杯子里,每次操作可能是左边和中间或右边和中间交换,问n次操作后,硬币在中间的概率
思路:
设
f(n)
是n次操作后硬币在中间的概率,则很明显,
f(n)=1−f(n−1)2
展开化简得到可以得到
anbn
的形式 易得
bn=2n−1
an=⎧⎩⎨⎪⎪⎪⎪2n−1+132n−1−13n为偶数,n为奇数
显然 2n−1+1 和 2n−1
互质,所以不用约分了,幂的操作可以用快速幂来处理,再用费马小定理转除为乘,这题就搞定了
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 1e5+10;
const int mod = 1e9+7;
typedef long long ll;
ll num;
ll pow_mod(ll x, ll n){
ll res=1;
while(n>0){
if(n&1)res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
}
int main (){
int n;
cin >>n;
ll b = 2;
ll flag = -1;
for(int i = 0 ; i < n ; i ++){
scanf("%I64d",&num);
b = pow_mod(b,num);
if(num %2 == 0) flag = 1;
}
b = b*pow_mod(2LL,mod-2)%mod; // b = 2^(n-1)=2^n/2
ll a = (b+flag+mod)%mod*pow_mod(3LL,mod-2)%mod; //a = (2^(n-1) -or+ 1) / 3
printf("%I64d/%I64d",a,b);
return 0;
}
注:一道经典的数论题,费马小定理求逆元就用这道题来练手了
另附:费马小定理求逆元