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

Date:2022.01.15
题意:有n + 2 n+2n+2个塔编号从[ 0 , n + 1 ] [0,n+1][0,n+1],在每个塔上建一个通讯器的概率都是1 2 \frac{1}{2}21,设每个通讯器传送半径为p pp,所在下标为i ii,即能传送讯息给[ i − ( p − 1 ) , i + ( p − 1 ) ] [i-(p-1),i+(p-1)][i(p1),i+(p1)]中的所有元素。要求:
①不能给下标为0 00n + 1 n+1n+1的塔传送消息。
②给下标为[ 1 , n ] [1,n][1,n]的所有塔都能收到消息,且只收到1 11次。
求方案数。
在这里插入图片描述
思路:设f [ i ] f[i]f[i]:不包含塔0 、 n + 1 0、n+10n+1,且长度为i ii的方案数。求当前f [ i ] f[i]f[i]时分别让1... ⌈ n 2 ⌉ 1...\lceil\frac{n}{2}\rceil1...2n处的p pp满足向左取到1 11,只有这样右边才不会取到n + 1 n+1n+1,再依次累加每一类的方案数。
f [ 1 ] : 1 f[1]:1f[1]:1i = 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]+1f[3]:f[2]+1i = 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]+1f[5]:f[4]+f[2]+1i = 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 ii分奇偶,再次将右边所有项归纳,不难得出:


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} \% 998244353f[n]2n1%998244353

即一个斐波那契数列,但由于每种方案的概率都是1 2 n \frac{1}{2^n}2n1,因此要除1 2 n \frac{1}{2^n}2n1。除法取模涉及同余,因此要找2 n 2^n2nm o d 998244353 mod 998244353mod998244353意义下的逆元。又因为998244353 998244353998244353为质数,因此( 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;
}

版权声明:本文为lppppppppps原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。