Educational Codeforces Round 98 (Rated for Div. 2)D. Radio Towers
题意:
在一条线上有 n + 2 n+2 n+2个镇,编号从 0 ∼ n + 1 0\sim n+1 0∼n+1。在 1 ∼ n 1\sim n 1∼n个镇上每个镇都有 1 2 \cfrac{1}{2} 21的概率安装一个信号塔,所有事件相互是独立的。如果一个在 i i i位置的信号塔的强度为 p p p,那么处于 ∣ c − i ∣ < p |c-i|\lt p ∣c−i∣<p的镇 c c c都会收到信号。你可以给信号塔设置强度 p p p。现在要求,装好的信号塔不能覆盖 0 0 0和 n + 1 n+1 n+1这两个镇,并且 1 ∼ n 1\sim n 1∼n的镇会且只会被 1 1 1个信号塔的信号覆盖。求满足这种条件的概率有多大。
思路:
设有
n
+
2
n+2
n+2个镇的时候,满足要求的情况有
f
(
n
)
f(n)
f(n)种。
显然答案是
f
(
n
)
2
n
\cfrac{f(n)}{2^n}
2nf(n),然后手推几下发现
f
(
n
)
f(n)
f(n)满足斐波那契数列,所以答案为
F
i
b
(
n
)
2
n
\cfrac{Fib(n)}{2^n}
2nFib(n)。
以下试推之:
我们可以显然得到
n
=
1
n=1
n=1时,
f
(
1
)
=
1
f(1)=1
f(1)=1,只有且仅只有在
1
1
1号镇上存在信号塔的时候才满足。
对于下面情况,我们只用考虑在
1
∼
⌈
n
2
⌉
1\sim \lceil\cfrac{n}{2}\rceil
1∼⌈2n⌉上面放
1
1
1个信号塔时候,剩余的区域应该如何去放置信号塔。因为一旦大于这个数,显然他就无法保证在能够覆盖到
1
1
1号镇的情况下不覆盖到
n
+
1
n+1
n+1号镇。
在
n
=
2
n=2
n=2的时候,在
1
1
1号镇装信号塔的话,那么对于剩下的镇
(
2
)
(2)
(2),就成了
n
=
1
n=1
n=1时候的情况。也就是说
f
(
2
)
=
f
(
1
)
f(2)=f(1)
f(2)=f(1)。
在
n
=
3
n=3
n=3的时候,在
1
1
1号镇装信号塔的话,那么对于剩下的镇
(
2
,
3
)
(2,3)
(2,3),就成了
n
=
2
n=2
n=2的状况;在
2
2
2号镇装信号塔的话,就可以正好覆盖所有镇。也就是
f
(
3
)
=
f
(
2
)
+
1
f(3)=f(2)+1
f(3)=f(2)+1。
在
n
=
4
n=4
n=4的时候,在
1
1
1号镇装信号塔的话,那么对于剩下的镇
(
2
,
3
,
4
)
(2,3,4)
(2,3,4),就是
n
=
3
n=3
n=3的状况;在
2
2
2号镇装信号塔的话,对于剩下的镇
(
4
)
(4)
(4),就是
n
=
1
n=1
n=1的状况。也就是
f
(
4
)
=
f
(
3
)
+
f
(
1
)
f(4)=f(3)+f(1)
f(4)=f(3)+f(1)。
在
n
=
5
n=5
n=5的时候,在
1
1
1号镇装信号塔的话,那么对于剩下的镇
(
2
,
3
,
4
,
5
)
(2,3,4,5)
(2,3,4,5),就是
n
=
4
n=4
n=4的状况;在
2
2
2号镇装信号塔的话,对于剩下的镇
(
4
,
5
)
(4,5)
(4,5),就是
n
=
2
n=2
n=2的状况;在
3
3
3号镇装信号塔的话,就可以正好覆盖所有镇。也就是
f
(
5
)
=
f
(
4
)
+
f
(
2
)
+
1
f(5)=f(4)+f(2)+1
f(5)=f(4)+f(2)+1。
⋯
⋯
\cdots\cdots
⋯⋯
这样是不是发现了一些规律。
显然,假设信号塔建在
i
(
i
∈
[
1
,
⌈
n
2
⌉
]
)
i(i\in[1,\lceil\cfrac{n}{2}\rceil])
i(i∈[1,⌈2n⌉])的时候,为了能够覆盖到
1
1
1号镇,它的信号强度就为
i
i
i,也就是说,它能够覆盖
[
1
,
2
i
−
1
]
[1,2i-1]
[1,2i−1]的镇。那么对于
[
2
i
,
n
]
[2i,n]
[2i,n]的镇来说,我们可以把它看成求
f
(
n
−
2
i
+
1
)
f(n-2i+1)
f(n−2i+1)。
那么我们可以得到下面的式子:
f
(
n
)
=
{
f
(
n
−
1
)
+
f
(
n
−
3
)
+
⋯
+
f
(
2
)
+
1
n
为
奇
数
f
(
n
−
1
)
+
f
(
n
−
3
)
+
⋯
+
f
(
1
)
n
为
偶
数
f(n)=\begin{cases}f(n-1)+f(n-3)+\cdots+f(2)+1&n为奇数\\f(n-1)+f(n-3)+\cdots+f(1)&n为偶数\end{cases}
f(n)={f(n−1)+f(n−3)+⋯+f(2)+1f(n−1)+f(n−3)+⋯+f(1)n为奇数n为偶数
根据斐波那契数列的性质:
F
i
b
(
1
)
+
F
i
b
(
3
)
+
⋯
+
F
i
b
(
2
n
−
1
)
=
F
i
b
(
2
n
)
Fib(1)+Fib(3)+\cdots+Fib(2n-1)=Fib(2n)
Fib(1)+Fib(3)+⋯+Fib(2n−1)=Fib(2n),
F
i
b
(
2
)
+
F
i
b
(
4
)
+
⋯
+
F
i
b
(
2
n
)
=
F
i
b
(
2
n
+
1
)
−
1
Fib(2)+Fib(4)+\cdots+Fib(2n)=Fib(2n+1)-1
Fib(2)+Fib(4)+⋯+Fib(2n)=Fib(2n+1)−1。
我们显然可以通过这个化简得到:
f
(
n
)
=
F
i
b
(
n
)
f(n)=Fib(n)
f(n)=Fib(n)。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
#define cl(x,y) memset(x,y,sizeof(x))
#define loop(x,y,z) for(x=y;x<=z;x++)
#define reve(x,y,z) for(x=y;x>=z;x--)
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define INF 1e18
const int N=1e6+10;
const int mod=998244353;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1);
using namespace std;
int f[N];
int qpow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)
ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,i;
cin>>n;
f[1]=f[2]=1;
for(i=3;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%mod;
cout<<f[n]*qpow(qpow(2,n),mod-2)%mod<<endl;
return 0;
}