1875: [SDOI2009]HH去散步
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 620 Solved: 265
[Submit][Status]
Description
HH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径
Input
第一行:五个整数N,M,t,A,B。其中N表示学校里的路口的个数,M表示学校里的 路的条数,t表示HH想要散步的距离,A表示散步的出发点,而B则表示散步的终点。 接下来M行,每行一组Ai,Bi,表示从路口Ai到路口Bi有一条路。数据保证Ai = Bi,但 不保证任意两个路口之间至多只有一条路相连接。 路口编号从0到N − 1。 同一行内所有数据均由一个空格隔开,行首行尾没有多余空格。没有多余空行。 答案模45989。
Output
一行,表示答案。
Sample Input
4 5 3 0 0
0 1
0 2
0 3
2 1
3 2
Sample Output
4
HINT
对于30%的数据,N ≤ 4,M ≤ 10,t ≤ 10。
对于100%的数据,N ≤ 20,M ≤ 60,t ≤ 230,0 ≤ A,B<n,0 ≤="" ai,bi="" <n。<="" p="">
Source
题解:
这题思路比较巧妙,既然同一条边走过之后不能立即返回来再走,那么我们就把矩乘里的点换成边,边换为边边之间的连接
因为这样一条边下一次走的就一定是另一条边了,而不会还“呆在原地”
这样矩阵自乘t-1次,最后统计一下答案即可
代码:(为什么TLE???)
1 const p=45989; 2 type matrix=array[0..200,0..200] of int64; 3 var a,b:matrix; 4 c:array[0..1000] of record x,y:longint;end; 5 i,j,n,m,x,y,s,t,dist,ans,mm:longint; 6 procedure init; 7 begin 8 readln(n,m,dist,s,t);mm:=m<<1-1; 9 for i:=0 to m-1 do 10 begin 11 readln(x,y); 12 c[i<<1].x:=x;c[i<<1].y:=y; 13 c[i<<1+1].x:=y;c[i<<1+1].y:=x; 14 end; 15 end; 16 procedure mul(var x,y,z:matrix); 17 var t:matrix;i,j,k:longint; 18 begin 19 fillchar(t,sizeof(t),0); 20 for i:=0 to mm do 21 for j:=0 to mm do 22 for k:=0 to mm do 23 t[i,j]:=(t[i,j]+x[i,k]*y[k,j]) mod p; 24 z:=t; 25 end; 26 27 procedure ksm(cs:longint); 28 begin 29 while cs>0 do 30 begin 31 if cs and 1=1 then mul(a,b,b); 32 cs:=cs>>1; 33 mul(a,a,a); 34 end; 35 end; 36 37 procedure main; 38 begin 39 fillchar(a,sizeof(a),0); 40 for i:=0 to mm do 41 for j:=0 to mm do 42 if (i<>j) and (i xor 1<>j) and (c[i].y=c[j].x) then 43 inc(a[i,j]); 44 for i:=0 to mm do b[i,i]:=1; 45 ksm(dist-1); 46 ans:=0; 47 for i:=0 to mm do 48 for j:=0 to mm do 49 if (c[i].x=s) and (c[j].y=t) then ans:=(ans+b[i,j]) mod p; 50 writeln(ans); 51 end; 52 53 begin 54 assign(input,‘input.txt‘);assign(output,‘output.txt‘); 55 reset(input);rewrite(output); 56 init; 57 main; 58 close(input);close(output); 59 end.
BZOJ1875: [SDOI2009]HH去散步,布布扣,bubuko.com