cf1452 Educational Round 98 Div2-D【DP+同余】

44 篇文章 0 订阅

Date:2022.01.15
题意:有 n + 2 n+2 n+2个塔编号从 [ 0 , n + 1 ] [0,n+1] [0,n+1],在每个塔上建一个通讯器的概率都是 1 2 \frac{1}{2} 21,设每个通讯器传送半径为 p p p,所在下标为 i i i,即能传送讯息给 [ i − ( p − 1 ) , i + ( p − 1 ) ] [i-(p-1),i+(p-1)] [i(p1),i+(p1)]中的所有元素。要求:
①不能给下标为 0 0 0 n + 1 n+1 n+1的塔传送消息。
②给下标为 [ 1 , n ] [1,n] [1,n]的所有塔都能收到消息,且只收到 1 1 1次。
求方案数。
在这里插入图片描述
思路:设 f [ i ] f[i] f[i]:不包含塔 0 、 n + 1 0、n+1 0n+1,且长度为 i i i的方案数。求当前 f [ i ] f[i] f[i]时分别让 1... ⌈ n 2 ⌉ 1...\lceil\frac{n}{2}\rceil 1...2n处的 p p p满足向左取到 1 1 1,只有这样右边才不会取到 n + 1 n+1 n+1,再依次累加每一类的方案数。
f [ 1 ] : 1 f[1]:1 f[1]:1 i = 1 , 只 有 这 1 种 方 案 , 贡 献 1 。 i=1,只有这1种方案,贡献1。 i=111
f [ 2 ] : f [ 1 ] f[2]:f[1] f[2]:f[1] i = 1 , 占 [ 1 , 1 ] , 其 右 边 相 当 于 f [ 1 ] 种 方 案 i=1,占[1,1],其右边相当于f[1]种方案 i=1[1,1]f[1]
f [ 3 ] : f [ 2 ] + 1 f[3]:f[2]+1 f[3]:f[2]+1 i = 1 , 占 [ 1 , 1 ] , 其 右 边 相 当 于 f [ 2 ] 种 方 案 ; i = 2 , 占 [ 1 , 3 ] , 仅 1 种 可 能 i=1,占[1,1],其右边相当于f[2]种方案;i=2,占[1,3],仅1种可能 i=1[1,1]f[2];i=2[1,3]1
f [ 4 ] : f [ 3 ] + f [ 1 ] f[4]:f[3]+f[1] f[4]:f[3]+f[1] i = 1 , 占 [ 1 , 1 ] , 其 右 边 相 当 于 f [ 3 ] 种 方 案 ; i = 2 , 占 [ 1 , 3 ] , 其 右 边 相 当 于 f [ 1 ] 种 方 案 i=1,占[1,1],其右边相当于f[3]种方案;i=2,占[1,3],其右边相当于f[1]种方案 i=1[1,1]f[3];i=2[1,3]f[1]
f [ 5 ] : f [ 4 ] + f [ 2 ] + 1 f[5]:f[4]+f[2]+1 f[5]:f[4]+f[2]+1 i = 1 , 占 [ 1 , 1 ] , 其 右 边 相 当 于 f [ 4 ] 种 方 案 ; i = 2 , 占 [ 1 , 3 ] , 其 右 边 相 当 于 f [ 2 ] 种 方 案 ; i = 3 , 占 [ 1 , 5 ] , 只 有 这 1 种 方 案 。 i=1,占[1,1],其右边相当于f[4]种方案;i=2,占[1,3],其右边相当于f[2]种方案;i=3,占[1,5],只有这1种方案。 i=1[1,1]f[4];i=2[1,3]f[2];i=3[1,5]1

因此可归纳得到:


f [ i ] = ∑ k = 0 ⌊ i − 1 2 ⌋ f [ i − 2 ⋅ k − 1 ] f[i]=\sum_{k=0}^{\lfloor\frac{i-1}{2}\rfloor}f[i-2·k-1] f[i]=k=02i1f[i2k1]

i i i分奇偶,再次将右边所有项归纳,不难得出:


f [ i ] = f [ i − 1 ] + f [ i − 2 ] f[i]=f[i-1]+f[i-2] f[i]=f[i1]+f[i2]

由此便求出所有 f [ i ] f[i] f[i]
因此答案即为:


f [ n ] ∗ 1 2 n % 998244353 f[n] * \frac{1}{2^n} \% 998244353 f[n]2n1%998244353

即一个斐波那契数列,但由于每种方案的概率都是 1 2 n \frac{1}{2^n} 2n1,因此要除 1 2 n \frac{1}{2^n} 2n1。除法取模涉及同余,因此要找 2 n 2^n 2n m o d 998244353 mod 998244353 mod998244353意义下的逆元。又因为 998244353 998244353 998244353为质数,因此 ( 2 n , 998244353 ) = = 1 (2^n,998244353)==1 (2n,998244353)==1,费马小定理+快速幂求解。
代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5+10,mod=998244353;
typedef long long LL;
LL a[N],f[N];
LL qmi(LL a,LL k,LL p)
{
    LL res=1;
    while(k)
    {
        if(k&1) res=res*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return res;
}
int main()
{
    LL n;cin>>n;
    f[1]=f[2]=1;
    for(int i=3;i<=n;i++)
        f[i]=(f[i-1]+f[i-2])%mod;
    cout<<f[n]*qmi(qmi(2,n,mod),mod-2,mod)%mod<<' ';
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值