首页 > 其他分享 >qoj3082 Ascending Matrix 题解

qoj3082 Ascending Matrix 题解

时间:2024-04-24 19:24:27浏览次数:29  
标签:ch Matrix int 题解 det knap read 1ll qoj3082

题目链接

点击打开链接

题目解法

不考虑第 \(a_{r,c}=v\) 的限制怎么求?
我们把条件形式化一下,发现 \(k\) 个区域的颜色可以表示成轮廓线的形式,即第 \(i-1\) 条到第 \(i\) 条轮廓线之间的格点颜色为 \(i\)
问题变成找到 \(k-1\) 条互不穿过的路径,起点为 \((1,m)\),终点为 \((n,1)\) 的方案数(下文中令 \(k:=k-1\))
考虑把互不穿过转化成不能经过相同点,怎么转化?
若 \((i,j)\) 的左上方有 \(x\) 条轮廓线(包括这个点),则把 \((i,j)\) 的坐标变成 \((i+x,j+x)\)
现在的起点就变成了 \((2,m+1),...,(1+k,m+k)\),终点变成了 \((n+1,2),...,(n+k,1+k)\)
画图不难理解这个转化的图像意义
这个问题就很典了,用 \(LGV\) 引理可以求出方案数

考虑加入 \(a_{r,c}=v\) 的限制
根据上面的转化,问题等价于 \((r+v-1,c+v-1)\) 的上方恰好有 \(v-1\) 条轮廓线
用生成函数表示,即令起点 \((1+x,m+x)\) 到终点 \((n+y,1+y)\) 的轮廓线在 \((r+v-1,c+v-1)\) 下方的方案数为 \(f_{x,y,0}\),上方的为 \(f_{x,y,1}\)
那么答案就是 \(e_{i,j}=f_{i,j,0}+f_{i,j,1}x\) 的行列式的 \(x^{v-1}\) 前面的系数

直接求多项式复杂度就爆了
考虑用点值求多项式
取 \(k+1\) 个点值求行列式,然后做一遍拉格朗日插值即可
时间复杂度 \(O(k^4+nk^2)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int K=110,N=410,P=998244353;
int n,m,k,r,c,v;
int fac[N],ifac[N],inv[N];
int f[K][K][2],e[K][K],knap[K],g[K];
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
inline void dec(int &x,int y){ x-=y;if(x<0) x+=P;}
int det(){
    int w=1;
    F(i,1,k) F(j,i+1,k){
        while(e[i][i]){
            int div=e[j][i]/e[i][i];
            F(q,i,k) dec(e[j][q],1ll*e[i][q]*div%P);
            swap(e[i],e[j]),w*=-1;
        }
        swap(e[i],e[j]),w*=-1;
    }
    int res=w;F(i,1,k) res=1ll*res*e[i][i]%P;
    return (res+P)%P;
}
int bin(int x,int y){ if(x<y||y<0) return 0;return 1ll*fac[x]*ifac[y]%P*ifac[x-y]%P;}
int calc(int x1,int y1,int x2,int y2){ return bin(x2-x1+y1-y2,x2-x1);}
int qmi(int x,int y){
    int res=1;for(;y;y>>=1){ if(y&1) res=1ll*res*x%P;x=1ll*x*x%P;}
    return res;
}
void comb(int n){
    fac[0]=1;F(i,1,n) fac[i]=1ll*fac[i-1]*i%P;
    ifac[n]=qmi(fac[n],P-2);DF(i,n-1,0) ifac[i]=1ll*ifac[i+1]*(i+1)%P;
    F(i,1,n) inv[i]=1ll*ifac[i]*fac[i-1]%P;
}
int main(){
    comb(N-1);
    read(n),read(m),read(k),read(r),read(c),read(v);k--;
    r+=v-1,c+=v-1;
    F(i,1,k) F(j,1,k){
        f[i][j][0]=calc(i,m+i,n+j,j);
        F(det,0,min(r,c)){
            int val=1ll*calc(i,m+i,r-det,c-det)*calc(r-det,c-det,n+j,j)%P;
            dec(f[i][j][0],val);
            if(det) inc(f[i][j][1],val);
        }
    }
    F(x,1,k+1){
        F(i,1,k) F(j,1,k) e[i][j]=(f[i][j][0]+1ll*f[i][j][1]*x)%P;
        g[x]=det();
    }
    int ans=0;
    F(i,1,k+1){
        ms(knap,0);knap[0]=1;
        F(j,1,k+1) if(i!=j){
            int iv;
            if(i-j>=0) iv=inv[i-j];else iv=P-inv[j-i];
            DF(q,k,0){
                knap[q]=(P-1ll*knap[q]*j%P*iv%P+P)%P;
                if(q) inc(knap[q],1ll*knap[q-1]*iv%P);
            }
        }
        inc(ans,1ll*knap[v-1]*g[i]%P);
    }
    printf("%d\n",ans);
    return 0;
}

标签:ch,Matrix,int,题解,det,knap,read,1ll,qoj3082
From: https://www.cnblogs.com/Farmer-djx/p/18156135

相关文章

  • P2882 题解
    思想一眼看上去,没什么思路。看一下标签。枚举!于是枚举\(K\)。然后变成了求最少次数。由于枚举放在第一个,我们还是考虑一下枚举。我们枚举反转区间的左端点,我们惊奇地发现,由于从左往右扫,如果左端点是朝后的,那这次不转就没机会了。所以最最简单的暴力:从左往右扫,遇到左端点......
  • 「洛谷」题解:P1217 回文质数
    题目传送门看着题目好像很简单的样子,实际上做起来才会发现,这么多函数他奶奶的是普及-难度?在这道题目当中,我们最少需要写两个函数,如果需要优化可以再多写一个,待会儿的代码我们就直接放最简单版本的了。有人说这道题可以暴力对拍之后再输出,这完全可以,但是这么简单的题目不至于使用......
  • 2022ccpc题解
    2023年第五届河南省CCPC大学生程序设计竞赛ProblemA.Mocha上小班啦思路:求n个数位的最小值,条件:每一位数字都不同切不含前导零。只需要把0放到第二位,其他按从小到大输出,大于10以后输出-1即可。#include<bits/stdc++.h>usingnamespacestd;intmain(){//预处......
  • P5900 无标号无根树计数 题解
    不懂为啥都要对原式神秘转化之后再牛顿迭代,直接对原式牛顿迭代即可!完全不用转化!设无标号有根树的组合类是\(\mathcalT\),则有\(\mathcalT=\mathcalZ\times\mathrm{MSET}(\mathcalT)\),即\(T(x)=x\exp\sum\limits_{j\ge1}\dfrac{T(x^j)}j\),设\(G(F(x))=F(x)-x\exp\sum\lim......
  • abc340E题解
    题目描述样例input:5312345240output:04272算法1(树状数组)$O(nlogn)$本题我们可以看作对于每一个查询位置x我们都需要先把该位置上的所有球拿出来,然后再一个一个的放到对应位置上去。假设x位置上面有y个球,那么对于这y个球,如果大于n,那么就对所有的位置放y......
  • P3667 Bovine Genomics Hash+二分题解
    砂金听说了你在学字符串,于是在CLOI里出了道题给你P3667BovineGenomics题链:洛谷hzoi提高\(hash\)基础题。思路是二分答案,\(check\)中比较每一个区间字串的\(hash\)值是否相等。比较的时候可以用\(set\)或\(map\)。\(set\)的好处在于无重元素,判断时先将\(a\)串中区间子串......
  • 抢先看!美团、京东、360等大厂面试题解析,技术面试必备。
    技术面试必备!美团、京东、360等大厂面试题详解,让你轻松应对各大公司面试挑战!往期硬核面经哦耶!冲进腾讯了!牛逼!上岸腾讯互娱和腾讯TEG!腾讯的面试,强度拉满!前几篇文章分享了上岸腾讯的最新面经。不少粉丝股东留言说别只发腾讯的啦,其他大厂的也安排一些吧,比如美团、360、京东的......
  • [ABC329C] Count xxx 题解
    [ABC329C]Countxxx题解题目分析目的:统计本质不同而不是位置不同的所有字符都相同的字串。需要理解一下什么是本质不同而不是位置不同。结合样例1去理解这句话。列举样例1中的所有所有组成字符相同的字串。aaabaa编号字串位置\(1\)a\([1,1]\)\(2\)aa\([1......
  • [题解]ARC176 A~B
    赛时心态崩了,0pts遗憾离场……今天在学校冷静思考了下。发现B题思路其实很简单,不过A题怎么也没有想到,回来看了题解,其实思路也很简单,不过是自己思考方向错了。看来打比赛心态很重要,如果能冷静下来思考结果会好很多。果然算法竞赛不能被常理所束缚(笑)A-01MatrixAgain行列从\(0......
  • 题解 UOJ577【[ULR #1] 打击复读】
    题解UOJ577【[ULR#1]打击复读referencehttps://www.cnblogs.com/crashed/p/17382894.htmlhttps://www.cnblogs.com/sizeof127/articles/17579027.html字符串——黄建恒,广东实验中学题目描述为了提升搜索引擎的关键词匹配度以加大访问量,某些网站可能在网页中无意义复读大......