Educational Codeforces Round 98 (Rated for Div. 2)D. Radio Towers

Educational Codeforces Round 98 (Rated for Div. 2)D. Radio Towers

题意:

在一条线上有 n + 2 n+2 n+2个镇,编号从 0 ∼ n + 1 0\sim n+1 0n+1。在 1 ∼ n 1\sim n 1n个镇上每个镇都有 1 2 \cfrac{1}{2} 21的概率安装一个信号塔,所有事件相互是独立的。如果一个在 i i i位置的信号塔的强度为 p p p,那么处于 ∣ c − i ∣ < p |c-i|\lt p ci<p的镇 c c c都会收到信号。你可以给信号塔设置强度 p p p。现在要求,装好的信号塔不能覆盖 0 0 0 n + 1 n+1 n+1这两个镇,并且 1 ∼ n 1\sim n 1n的镇会且只会被 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 12n上面放 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,2i1]的镇。那么对于 [ 2 i , n ] [2i,n] [2i,n]的镇来说,我们可以把它看成求 f ( n − 2 i + 1 ) f(n-2i+1) f(n2i+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(n1)+f(n3)++f(2)+1f(n1)+f(n3)++f(1)nn
根据斐波那契数列的性质:
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(2n1)=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;
}


  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值