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;
}

浙公网安备 33010602011771号