bzoj1875,懒得复制,戳我戳我

Solution:

  • 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和
  • 但又因为题目有要求不能走一样的边回去不是说不能回到之前那个点,而是不能走一样的边
  • 又因为\(t\)很大,每次我们的都是做的重复的操作,我们就可以想到矩阵快速幂
  • 为了保证不走重边回去,我们就可以用一个骚操作,把边化作点,然后双向边可以看做两条单向边,然后把每条单向边看做节点,连向所(这条边连向的节点)连出去的边。但是不连这条边的反向边,这样就可以保证不走一样的路回去了(超级机智)



    如上图的\(1\)号边连向\(2\)号边,我们就可以把这个存在矩阵里面了
  • 然后来一遍矩阵快速幂就好了,注意是\(t-1\)次,因为最后一次没走到,是到边上,没有回到\(B\)点
  • 初始矩阵是把\(A\)点所有连出去的边\(+1\),然后把初始矩阵乘以快速幂后的矩阵,\(ans\)就是最后得到矩阵中所有连向\(B\)边上存的值和
  • 丢一个我觉得讲的很清楚的博客

Attention:

  • 会有重复边,所以矩阵里面是\(+1\),不是直接赋值为\(1\)
  • 不能走一样的路回去,可以走另一条路回到先前的点

Code:

//It is coded by Ning_Mew on 5.10
#include<bits/stdc++.h>
#define IL inline
using namespace std; const int maxn=125,MOD=45989; int n,m,t,A,B,out=0;
struct Blc{
int a[maxn][maxn];
Blc(){memset(a,0,sizeof(a));}
}bas;
int head[maxn],cnt=0;
struct Edge{
int nxt,to;
}edge[maxn]; void add(int from,int to){
edge[++cnt].nxt=head[from];edge[cnt].to=to;head[from]=cnt;
}
IL int o(int x){if(x%2)return x+1;return x-1;}
IL Blc X(Blc x,Blc y){
Blc ans;
for(int i=1;i<=2*m;i++){
for(int j=1;j<=2*m;j++){
for(int k=1;k<=2*m;k++){
ans.a[i][j]+=x.a[i][k]*y.a[k][j]%MOD;
ans.a[i][j]%=MOD;
}
}
}return ans;
}
IL Blc q_pow(Blc x,int s){
Blc ans=bas;
while(s){
if(s%2)ans=X(ans,x);
x=X(x,x);
s=s/2;
}return ans;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&t,&A,&B);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
Blc box;
for(int u=0;u<n;u++){
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;
for(int ii=head[v];ii!=0;ii=edge[ii].nxt){
//cout<<"pr:"<<i<<' '<<ii<<endl;
if(i==o(ii))continue;
bas.a[i][ii]++;
}
}
}
//pr(bas);
for(int i=head[A];i!=0;i=edge[i].nxt){box.a[1][i]++;} Blc ans=q_pow(bas,t-2); ans=X(box,ans); for(int i=1;i<=2*m;i++){
if(edge[i].to==B){out=(out+ans.a[1][i])%MOD;}
}
//cout<<endl;pr(ans);
printf("%d\n",out);
return 0;
}

【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)的更多相关文章

  1. BZOJ 1875 [SDOI2009]HH去散步 ——动态规划 矩阵乘法

    发现t非常大,所以大概就是快速幂一类的问题了, 然后根据k^3logn算了算,发现k大约是边数的时候复杂度比较合适. 发现比较麻烦的就是前驱的记录,所以直接把边看做点,不能走反向边,但是可以走重边,然 ...

  2. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  3. [难题题解] [BZOJ1875] [SDOI2009] HH去散步

    题目H有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人 ...

  4. 1875. [SDOI2009]HH去散步【矩阵乘法】

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...

  5. BZOJ 1875: [SDOI2009]HH去散步(矩阵乘法)

    首先,题意就把我们引向了矩阵乘法,注意边长m<=60,那么就按边建图,变成一个120个点的图,然后乱搞就行了。 PS:WA了N久改了3次终于A了QAQ CODE: #include<cst ...

  6. [SDOI2009]HH去散步 「矩阵乘法计数」

    计数问题也许可以转化为矩阵乘法形式 比如若该题没有不能在一条边上重复走的条件限制,那么直接将邻接矩阵转化为矩阵乘法即可 故 矩阵乘法计数 对于计数问题,若可以将 \(n\) 个点表示成 \(n \ti ...

  7. [bzoj1875][SDOI2009] HH去散步 [dp+矩阵快速幂]

    题面 传送门 正文 其实就是让你求有多少条长度为t的路径,但是有一个特殊条件:不能走过一条边以后又立刻反着走一次(如果两次经过同意条边中间隔了别的边是可以的) 如果没有这个特殊条件,我们很容易想到dp ...

  8. BZOJ.1875.[SDOI2009]HH去散步(DP 矩阵乘法)

    题目链接 比较容易想到用f[i][j]表示走了i步后到达j点的方案数,但是题目要求不能走上一条走过的边 如果这样表示是不好转移的 可以考虑边,f[i][j]表示走了i步后到达第j条边的方案数,那么有 ...

  9. BZOJ-1875 HH去散步 DP+矩阵乘法快速幂

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...

  10. BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )

    把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...

随机推荐

  1. Java基础—面向对象

    一.什么叫面向对象 万物皆对象(待更正) 二.面向对象三大特征 抽象:把一类对象共同特征进行抽取构造类的过程,包括两种抽象:第一种是数据抽象,也就是对象的属性.第二种是过程抽象,也就是对象的行为 封装 ...

  2. 20155210 EXP6 信息搜集与漏洞扫描

    20155210 EXP6 信息搜集与漏洞扫描 信息搜集 外围信息搜集 通过DNS和IP挖掘目标网站的信息 whois 域名注册信息查询 我们通过输入whois qq.com可查询到3R注册信息,包括 ...

  3. 20155330 《网络对抗》 Exp2 后门原理与实践

    20155330 <网络对抗> 实验二 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 在网站上下载非官方软件,所下载的软件中携带伪装过的后门程序. 例举你 ...

  4. [GitHub]GitHub for Windows离线安装的方法

    这几天一直在尝试安装GitHub for windows ,安装程序是从https://windows.github.com/ 下载到的OneClick 部署程序,版本号为2.11.0.5.可能是因为 ...

  5. python变量名感悟

    我感悟的是python的变量名其实就可以理解为C/C++中的指针! 1.python的变量在使用之前必须赋值,就像指针在使用之前不能为空. 2.python的内存可以用del释放,C++可以用dele ...

  6. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]

    题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...

  7. BigDecimal工具类

    package config_service.slowcity; import java.math.BigDecimal; public class ConfigServerApp { /* * 小数 ...

  8. linux之awk基础

    第一章 1.awk 简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取 ...

  9. 基于约束的SQL攻击

    前言 值得庆幸的是如今开发者在构建网站时,已经开始注重安全问题了.绝大部分开发者都意识到SQL注入漏洞的存在,在本文我想与读者共同去探讨另一种与SQL数据库相关的漏洞,其危害与SQL注入不相上下,但却 ...

  10. PHP学习 类型 变量 常数 运算符

    PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...