争夺基友争夺基友 (friend.pas/c/cpp)
争夺基友争夺基友
【问题描述】
小宸和小松都很想和乐乐在一起,但是乐乐说他只需要一个基友。于是小宸和小松决定
用抛掷硬币的方式来决定谁能成为乐乐的基友。
游戏共有n 局,规则如下:一人先掷,如果掷得正面,则此人获胜,如果是反面则由另
外一人掷,如此交替,直到第一次抛出正面时本局结束,掷得正面者获胜。下一局则由未获
胜的人先掷,规则同上。
由于小宸希望成为乐乐基友的愿望非常强烈,于是找到了聪明的你,请你告诉他,小宸
在第n 局恰好获胜的概率是多少。另外他还告诉你,第一局是由小宸先掷。
【输入数据】
一个整数n,含义如题目描述。
【输出数据】
一个最简分数,形如a/b,表示小宸在第n 局恰好获胜的概率。
【样例输入】
2
【样例输出】
4/9
【数据范围及约定】
对于50% 的数据:1≤n≤16;
争夺基友争夺基友
【问题描述】
小宸和小松都很想和乐乐在一起,但是乐乐说他只需要一个基友。于是小宸和小松决定
用抛掷硬币的方式来决定谁能成为乐乐的基友。
游戏共有n 局,规则如下:一人先掷,如果掷得正面,则此人获胜,如果是反面则由另
外一人掷,如此交替,直到第一次抛出正面时本局结束,掷得正面者获胜。下一局则由未获
胜的人先掷,规则同上。
由于小宸希望成为乐乐基友的愿望非常强烈,于是找到了聪明的你,请你告诉他,小宸
在第n 局恰好获胜的概率是多少。另外他还告诉你,第一局是由小宸先掷。
【输入数据】
一个整数n,含义如题目描述。
【输出数据】
一个最简分数,形如a/b,表示小宸在第n 局恰好获胜的概率。
【样例输入】
2
【样例输出】
4/9
【数据范围及约定】
对于50% 的数据:1≤n≤16;
对于100%的数据:1≤n≤32。
这套题是以我们机房为背景出的。
这道题我推公式推到一半。。导致分数也是一半。。
等比数列求和公式求极限可以得出第一轮lcy获胜的几率是2/3。
然后第i局lcy获胜的几率P[i]=P[i-1]*1/3+(1-P[i-1])*2/3。
可以推出通项公式是P[n] = 1/6*(-1/3)^(n-1)+1/2。再加上快速幂就可以秒过
#include <cmath>
#include <cstdio>
#include <iostream>
#include <cstdlib>
inline long long min(long long &a,long long &b)
{
if (a > b)
return a;
else return b;
}
long long kysumi(long a,long b)
{
long long ans = 1;
long long y = a;
while (b>0)
{
if (b&1==1)
{
ans *= y;
}
y *= y;
b >>= 1;
}
return ans;
}
long long kgcd(long long a, long long b)
{
while (b)
{
long long c = a%b;
a = b;
b = c;
}
return a;
}
int main()
{
freopen("friend.in","r",stdin);
freopen("friend.out","w",stdout);
long n;
std::cin >>n;
long long thr = kysumi(3,n-1);
if ((n&1)==0)
thr = -thr;
long long fm = thr*6*2;
long long fz = thr*6+2;
long long g = kgcd(fm,fz);
std::cout << fz/g << "/" << fm/g;
return 0;
}