首页 > 其他分享 >[ABC309Ex] Simple Path Counting Problem

[ABC309Ex] Simple Path Counting Problem

时间:2023-09-22 19:44:41浏览次数:36  
标签:le Simple int ch read 卷积 ABC309Ex Problem dp

Problem Statement

We have a grid with $N$ rows and $M$ columns. We denote by $(i,j)$ the cell in the $i$-th row from the top and $j$-th column from the left.

You are given integer sequences $A=(A_1,A_2,\dots,A_K)$ and $B=(B_1,B_2,\dots,B_L)$ of lengths $K$ and $L$, respectively.

Find the sum, modulo $998244353$, of the answers to the following question over all integer pairs $(i,j)$ such that $1 \le i \le K$ and $1 \le j \le L$.

  • A piece is initially placed at $(1,A_i)$. How many paths are there to take it to $(N,B_j)$ by repeating the following move $(N-1)$ times?
    • Let $(p,q)$ be the piece's current cell. Move it to $(p+1,q-1),(p+1,q)$, or $(p+1,q+1)$, without moving it outside the grid.

Constraints

  • $1 \le N \le 10^9$
  • $1 \le M,K,L \le 10^5$
  • $1 \le A_i,B_j \le M$
先考虑如何计算某一个点到另一个点的方案数。

定义 \(dp_{i,j}\) 为到达 \((i,j)\) 的方案数,那么 \(dp_{i,j}=dp_{i-1,j-1}+dp_{i-1,j}+dp_{i-1,j+1}\)。

看似可以多项式快速幂优化,但是会发现有边界问题。

如何解决边界问题?对称一下,使 \(dp_{n+1-i}=-dp_i\),然后卷积的时候就可以把 \(j\le N\) 的限制给去掉。

\(x>0\) 的限制怎么去? 用 \(2n+2\) 的循环卷积即可。

然后循环卷积快速幂就可以了。

原题也一样,循环卷积跑出来 \((1+x+x^{-1})^N\) 的系数卷上 \(A\) 数组就可以了。

#include<bits/stdc++.h>
using namespace std;
const int N=524288,P=998244353;
int n,m,k,a,b,rr[N],ans,f[N],g[N],h[N],p,l;
int read()
{
    int s=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
        ch=getchar();
    while(ch>='0'&&ch<='9')
        s=s*10+ch-48,ch=getchar();
    return s;
}
int pown(int x,int y)
{
    if(!y)
        return 1;
    int t=pown(x,y>>1);
    if(y&1)
        return 1LL*t*t%P*x%P;
    return 1LL*t*t%P;
}
void ntt(int a[],int op)
{
    for(int i=1;i<N;i++)
        if(rr[i]<i)
            swap(a[i],a[rr[i]]);
    for(int md=1;md<N;md<<=1)
    {
        int g=pown(op? 3:332748118,(P-1)/(md<<1));
        for(int i=0;i<N;i+=md<<1)
        {
            int pw=1;
            for(int j=0;j<md;j++,pw=1LL*g*pw%P)
            {
                int x=a[i+j+md]*1LL*pw%P;
                a[i+j+md]=(a[i+j]+P-x)%P;
                (a[i+j]+=x)%=P;
            }
        }
    }
    if(!op)
    {
        int ivN=pown(N,P-2);
        for(int i=0;i<N;i++)
            a[i]=1LL*a[i]*ivN%P;
    }
}
void mul(int a[],int b[])
{
    ntt(a,1);
    ntt(b,1);
    for(int i=0;i<N;i++)
        a[i]=1LL*a[i]*b[i]%P;
    ntt(a,0);
    for(int i=p;i<N;i++)
        (a[i%p]+=a[i])%=P,a[i]=0;
}
void solve(int x)
{
    if(x==1)
        return;
    if(x&1)
    {
        solve(x-1);
        memcpy(h,f,sizeof(h));
        for(int i=0;i<p;i++)
            f[i]=(1LL*h[i]+h[(i+p-1)%p]+h[(i+1)%p])%P;
    }
    else
    {
        solve(x>>1);
        memcpy(h,f,sizeof(h));
        mul(f,h);
    }
}
int main()
{
    n=read(),m=read(),k=read(),l=read();
    p=2*m+2;
    for(int i=0;i<N;i++)
        rr[i]=rr[i>>1]>>1|(i&1)*(N/2);
    for(int i=1;i<=k;i++)
        a=read(),g[a]++,(g[2*m-a+2]+=P-1)%=P;
    if(n^1)
    {
        f[0]=f[p-1]=f[1]=1;
        solve(n-1);
        mul(g,f);
    }
    for(int i=1;i<=l;i++)
        (ans+=g[read()])%=P;
    printf("%d",ans);
}

标签:le,Simple,int,ch,read,卷积,ABC309Ex,Problem,dp
From: https://www.cnblogs.com/mekoszc/p/17723218.html

相关文章

  • CF 1867 E1. Salyg1n and Array (simple version)
    Link简单版本的结论还是很容易猜到的。首先很容易想到的第一步就是尽可能地不覆盖地取尽可能多地区间,最后剩下了一小块。然后在接着原来的指针一个一个地往右问,直到不能问了为止。为什么这样是正确的呢?首先,在这样一步一步地往右查询的过程中,我们会发现总是前$k-1个数加上后面......
  • Django SimpleUI打造美丽后台
    DjangoSimpleUI打造美丽后台Django后台美化插件中,SimpleUI处于第一阵营,非常符合国人的审美观。本文将手把手教你如何配置使用SimpleUI,包括自定义菜单和控制面板等高级使用技巧. 安装 第一步pip安装并加入INSTALLED_APPSpipinstalldjango-simpleui ......
  • SOEM的simple_test代码分析
    安装soem下载SOEM的源码,点击链接下载windows下的插件,winpcap安装winpcap,傻瓜式安装解压代码包windows下编译源代码使用vs自带的make进行编译,我电脑安装有vs2022:打开vs自带的环境控制台,切换到SOEM主站目录下创建一个build目录,我们之后编译生成的文件放到这个目录切换......
  • SimpleDateFormat详解
    publicclassSimpleDateFormatextendsDateFormatSimpleDateFormat是一个以国别敏感的方式格式化和分析数据的具体类。它允许格式化(date->text)、语法分析(text->date)和标准化。SimpleDateFormat允许以为日期-时间格式化选择任何用户指定的方式启动。但是,希望用......
  • 洛谷 P9503『MGOI』Simple Round I | B. 魔法照相馆 の 题解
    这道题是一道模拟题,坑点不多,但是细节特多,所以导致大部分人\(A\)不了这道题。这道题我也写了注释,如果思路没明白可以看代码和注释的。先创建一个长度为\(3\)的字符串\(s1\),这个字符串的意思就是模拟现在的这几个幕布的情况,这里分了四个字符代表着四种情况,详细如下该字符串......
  • 洛谷 P9502 『MGOI』Simple Round I | A. 魔法数字 の 题解
    直接用pow()函数暴力判断即可,一旦不符合条件就立即跳出循环,要注意开longlong或unsignedlonglong。#include<iostream>#include<cmath>usingnamespacestd;unsignedlonglongn,num;intmain(){cin>>n;for(unsignedlonglongi=2;i<=n;i+=......
  • 基于自定义表编写认证类、django-jwt源码分析、权限介绍、simpleui的使用
    基于自定义表编写认证类补充:翻译函数只要做了国际化,就会显示当前国家的语言fromdjango.utils.translationimportgettext_lazyas_msg=_('Signaturehasexpired.')#_是个函数的别名,这个函数是翻译函数,只要做了国际化,它就是中文认证类fromrest_framework_jwt......
  • CF1867E1 Salyg1n and Array (simple version)
    思路首先考虑,\(n\)是\(k\)的倍数的情况,直接枚举询问所有每一段就好,然后输出每一段的异或和的异或和。如上图,每次询问都没有重叠部分,颠转互不干扰。那么,\(n\)不是\(k\)的倍数的情况呢?可以看到,与第一种情况的区别就是末尾多了一小截,那么我们需要考虑如何计算这一小截的......
  • F. Remainder Problem 根号分治
    Problem-F-Codeforces 题意:一个500000长度的数列,一开始都是0,进行q次操作,操作如下1,输入x,y,令a[x]+=y。2,输入x,y,输出对于sum(a[idx]),idx的条件是idx=x%y。做法:如果我们模拟做,那么第一种操作就是o(1),第二种操作就是o(n)。我们换种想法,建立一个二维数组b[x][y],表......
  • Paper Reading: Hashing-Based Undersampling Ensemble for Imbalanced Pattern Class
    目录研究动机文章贡献本文方法整体流程基于哈希的子空间划分方法基于距离的样本选择实验结果数据集和实验设置不同子空间划分方法的影响不同加权方案的抽样与其他方法比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到......