BZOJ1875 HH去散步

这题 我承认 我过于NAIVE了 我把不能走回边 搞成了 走到一个点必须休息一下。。。

  发现它的边数非常少 所以 按边建立矩阵 就可以十分科学的完成本题

  矩乘我一定要封装进p,q

BZOJ 1875

 1 #include<bits/stdc++.h>
 2 #define mod 45989
 3 #define ll long long
 4 #define breaks printf("!\n");
 5 using namespace std;
 6
 7 inline int read()
 8 {
 9     int x=0,f=1;char ch=getchar();
10     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
11     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
12     return x*f;
13 }
14 struct edge
15 {
16     int u,v,next;
17 }vs[300];
18 int st[80],ee=1;
19 int n,m,t,A,B;
20 struct matrix
21 {
22     int mat[130][130];
23     void clr()
24     {
25         for(int i=1;i<=ee;i++)
26             for(int j=1;j<=ee;j++)
27         mat[i][j]=0;
28     }
29 }M;
30 matrix operator*(matrix a,matrix b)
31 {
32     matrix tmp; tmp.clr();
33     for(int i=1;i<=ee;i++)
34         for(int j=1;j<=ee;j++)
35             for(int k=1;k<=ee;k++)
36     (tmp.mat[i][j]+=1ll*a.mat[i][k]*b.mat[k][j]%mod)%=mod;
37     return tmp;
38 }
39 matrix operator^(matrix x,int p)
40 {
41     matrix tmp;tmp.clr();
42     for(int i=1;i<=ee;i++)
43         tmp.mat[i][i]=1;
44     for(;p;p>>=1,x=x*x)
45         if(p&1)tmp=tmp*x;
46     return tmp;
47 }
48 inline void addedge(int u,int v)
49 {
50     vs[++ee].v=v;vs[ee].u=u;
51     vs[ee].next=st[u];st[u]=ee;
52 }
53 int main()
54 {
55 //    freopen("a.out","w",stdout);
56     n=read();m=read();t=read();
57     A=read();B=read();
58     for(int i=1;i<=m;i++)
59     {
60         int a=read(),b=read();
61         addedge(a,b);addedge(b,a);
62     }
63     matrix xx; xx.clr();
64     for(int i=st[A];i;i=vs[i].next)
65         xx.mat[1][i]++;
66     for(int i=2;i<=ee;i++)
67         for(int j=2;j<=ee;j++)
68     if(vs[i].v==vs[j].u)
69     if(i!=(j^1))M.mat[i][j]++;
70    // xx.print(); M.print();
71     xx=xx*(M^(t-1)); int ans=0;
72     for(int i=st[B];i;i=vs[i].next)
73         (ans+=xx.mat[1][i^1])%=mod;
74     cout<<ans<<endl;
75     return 0;
76 }

时间: 2024-10-20 06:18:05

BZOJ1875 HH去散步的相关文章

BZOJ1875: [SDOI2009]HH去散步

1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 620  Solved: 265[Submit][Status] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法.

【bzoj1875】【SDOI2009】【HH去散步】

1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status][Discuss] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多

BZOj-1875: [SDOI2009]HH去散步 (矩阵快速幂)

1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1999  Solved: 980[Submit][Status][Discuss] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每 天走过的路径都不完全一样,他想知道他究竟

bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法

1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每 天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都 是一样的都是1),问长度为t,从给定

BZOJ 1875[SDOI2009]HH去散步

题面: 1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1750  Solved: 851[Submit][Status][Discuss] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每 天走过的路径都不完全一样,他想知

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

把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 --------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MOD = 45989; const int

[SDOI2009]HH去散步

[SDOI2009]HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 输入输出格式 输入格式: 第一行:五个整数N,M,t,A,B.其

【SDOI2009】【BZOJ1875】HH去散步

Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 Input 第一行:五个整数N,M,t,A,B.其中N表示学校里的路口的个数,M表

【BZOJ1875】【矩阵乘法】[SDOI2009]HH去散步

Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 Input 第一行:五个整数N,M,t,A,B.其中N表示学校里的路口的个数,M表