首页 > 其他分享 >P4159 [SCOI2009] 迷路 题解

P4159 [SCOI2009] 迷路 题解

时间:2024-01-26 09:01:21浏览次数:34  
标签:10 ch int 题解 边权 矩阵 SCOI2009 P4159 我们

P4159 [SCOI2009] 迷路

搬运工
题目链接
首先我们先考虑这道题的弱化版如何处理。假如所有的边权都是零和一。
这时他们的边权可以看做这两个点走一步到达之间的方案数。
而对于走 t 步,我们可以推出下列式子, \(f_{i,j}\) 表示从节点 \(i\) 到节点 \(j\) 的方案数。

\[f_{i,j}=\sum {f_{i,k}\cdot f_{k,j}} \]

是不是很熟悉,我们发现它就是矩阵乘法的式子。
对于这个,这里有一道题P2233 [HNOI2002] 公交车路线,我们直接考虑矩阵加速,即可求出。
回到这道题
通过观察,我们发现他的每一个边权都很小,不会超过九(其实这就暗示了解法)
我们不妨考虑把每一个点拆成9个边权为1或0的点,可以这样想象(当然也有另外的拆法,大同小异)
我们可以将第一个点拆成 \(1.0\ ,\ 1.1,\ 1.2,\ 1.3,\dots \ 1.8,\ 1.8\)
其中 \(1.0\) 代表的就是这个点,我们可以叫他“真点”
而对于 \(1.i\) 这样的点,它代表距离“真点” \(1\) 距离为 \(i\) 的点,我们叫它“假点”。
\(2\leq n\leq 10\) ,所以我们可以拆成 \(9n\cdot 9n\) 的矩阵。
在读入边权之前,我们需要将每个点的后八个假点每两个相邻的连接,边权为1 。
对于边权 \(u,v,w\),我们将 \(u\) 连到 \(v.w\) 边权为1
这样就构造出了矩阵。然后直接跑矩阵快速幂就行。
对于求第 \(t\) 步的方案数,时间复杂度为 \(O(\ \ (9n)^3\log t\ \ )\)
代码如下

/*
 * @Author: Ishar-zdl 
 * @Date: 2023-10-14 15:03:04 
 * @Last Modified by: Ishar-zdl
 * @Last Modified time: 2023-10-15 07:51:30
 */
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
    return x*f;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
const int mod=2009,N=95;
struct mt{
    int n,t[N][N];
    inline mt(){memset(t,0,sizeof(t));}
    inline void clear(){
        memset(t,0,sizeof(t));
        for(int i=1;i<=n;++i)t[i][i]=1;
    }
    inline mt operator*(const mt&b)const{
        mt res;int r;res.n=b.n;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j){
                for(int k=1;k<=n;++k)
                    res.t[i][j]+=t[i][k]*b.t[k][j];
                res.t[i][j]%=mod;
            }
        return res;
    }
    inline mt operator^(int p)const{
        mt res,x=*this;res.n=x.n;
        res.clear();
        for(;p;p>>=1,x=x*x)
            if(p&1)res=res*x;
        return res;
    }
}base;
int main(){
    // freopen("in.in","r",stdin);
    // freopen("out.out","w",stdout);
    int n=read(),q=read();base.n=9*n;
    int a;
    for(int i=1;i<=n;++i){
        for(int zc=i*9-7;zc<=i*9;zc++)
            base.t[zc][zc-1]=1;
        for(int j=1;j<=n;++j){
            scanf("%1d",&a);
            if(a)
            base.t[i*9-8][j*9-9+a]=1;
        }
    }
    base=base^q;
    write(base.t[1][n*9-8]);
    return 0;
}

标签:10,ch,int,题解,边权,矩阵,SCOI2009,P4159,我们
From: https://www.cnblogs.com/Ishar-zdl/p/17988566

相关文章

  • # python3 安装Crypto包 出现No module named ‘Crypto‘和No module named ‘Crypto.
    python3安装Crypto包出现Nomodulenamed‘Crypto‘和Nomodulenamed‘Crypto.Util‘问题解决方法1.改成安装pycryptodome然而在python36中无法报错:error:MicrosoftVisualC++14.0orgreaterisrequired"2.改用Anaconda安装指定版本的pycryptodomepipins......
  • 2024年1月Java项目开发指南12:前后端分离项目跨域问题解决
    创建config文件夹,创建WebConfig文件代码如下(可以直接抄)packagecc.xrilang.serversystem.config;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.se......
  • CF145E Lucky Queries 题解
    题目链接:CF或者洛谷前置知识点:序列操作本文关键词约定俗称:因为频繁敲最长不下降子序列\(LNCS\)和最长不上升子序列\(LNIS\)太麻烦了,下文将\(000011111\)这种最长不降子序列用\(LIS\)描述,\(1111100000\)这种最长不升子序列用\(LDS\)描述。这里面只有\(4\)和\(7......
  • 魔法少女LJJ 题解
    魔法少女LJJ题解这题纯属就是迷惑题。。为什么这么说?注意数据范围:对100%的数据\(0\leqm\leq400000\),\(c\leq7\)。\(c\leq7\)!!这意味着根本没有删除操作。就连样例也是错的。Solution这题的各种操作,用并查集+线段树合并完成。如果你是被题目数据范围晃飞的,建议......
  • loj 6095 花神的嘲讽计划 题解
    题目哈希记录每个\(k\)长度的串,询问的时候可以拿主席树或二分,这里说下二分。将\(n-k+1\)个串从小到大排序,以哈希值为第一关键字,序号为第二关键字。每次询问直接查找大于等于当前哈希值的位置即可,找到之后判断一下合不合法即可。具体看代码:#include<bits/stdc++.h>typede......
  • P8659 [蓝桥杯 2017 国 A] 数组操作 题解
    题目链接:洛谷或者蓝桥杯或者C语言中文网几个OJ的AC记录:忘了哪个OJ的:洛谷:C语言中文网:蓝桥杯:emmmmmmm,好像每个OJ给的时限和空间还不一样,蓝桥杯官方还给了$3s$和$2G$,C语言中文网机子比较老可能,挺卡常的,开了个究极快读和指令集就过去了,也可以自己调下重构常数,偷懒......
  • P3355 骑士共存问题题解
    题目链接:P3355骑士共存问题-洛谷|计算机科学教育新生态(luogu.com.cn)题解:棋盘问题考虑黑白染色成为二分图后做。观察马的性质,可知一个点只能到一个异色点,所以,构造方案可以先将所有同色点放上马,再考虑有那些异色点不可以放置。方法一:网络流,时间复杂度为O(|E|min(|E|0.5......
  • P7900 [COCI2006-2007#2] SJECIŠTA_题解
    [COCI2006-2007#2]SJECIŠTA_题解rt我们来看一下题目描述考虑一个有$n$个顶点的凸多边形,且这个多边形没有任何三个(或以上)的对角线交于一点。这句话什么意思?当顶点为$n$的图形为正多边形时便有可能出现一个点是有三条线相交而构成的如图如图情况就有三个......
  • P9779_[HUSTFC 2023] 不定项选择题_题解
    rt题目有一道共n个选项的不定项选择题,它的答案至少包含一个选项,由于题目与选项的内容晦涩难懂,你打算通过尝试每一种可能的答案来通过这道题。初始时所有选项都没有被勾选,你可以执行任意次下述操作:勾选一个当前未被勾选的选项。取消勾选一个当前已被勾选的选项。当你......
  • P2045 方格取数加强版题解
    题目链接:P2045方格取数加强版-洛谷|计算机科学教育新生态(luogu.com.cn)题目:出一个n*n的矩阵,每一格有一个非负整数A{i,j}且A{i,j} <=10^3现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要......