CF1452D 题解

思路

这是一道概率题,思路很明显是 **递推** 。

观察一下题目,根据题意,当有 $n+2$ 个小镇时,设信号塔有 $k$ 种分布方案,很容易得出答案为 $\tfrac{k}{2^n}$ 。我们可以先枚举找出当有 $n+2$ 个小镇时 $k$ 的值。

很明显 $n=1$ 时 $k$ 只有 $1$ 种情况, $n=2$ 时也只有一种情况,当 $n=3$ 时,可以在三个小镇各装一个 $p=1$ 的信号塔,也可以在二号小镇装一个 $p=2$ 的信号塔,这样编号为一和三的两小镇也能被覆盖到,此时 $k=3$ 。由此类推,可以发现 $k$ 的值是一个斐波那契数列。这样就能通过递推求出 $k$ 的值,再写一个快速幂求出 $2^n$ ,最后模上模数,输出答案就好了。

Code

#include <bits/stdc++.h>
using namespace std;
long long n;
long long a[1000010];
long long b[1000010];
long long mod=998244353;
long long ans;
long long ksm(long long a,long long b,long long p){
    long long ans=1;
    while(b>0){
        if(b&1) ans=ans*a%p;
        a=a*a%p;
        b/=2;
    }
    return ans%p;
}
int main(){
	cin>>n;
	ans=ksm(2,n,mod);
	a[1]=1;
	a[2]=1;
	for(int i=3;i<=n;i++){
		a[i]=a[i-1]+a[i-2];
		a[i]%=mod;
	} 
	cout<<a[n]*ksm(ans,mod-2,mod)%mod;
	
}
posted @ 2023-03-02 10:16  一个潘的烨  阅读(29)  评论(0)    收藏  举报