首页 > 代码库 > BZOJ3792: 跑步
BZOJ3792: 跑步
题解:
感觉被坑出翔。。。
显然我们把矩阵乘法中的点当成原图中的边就可以了。
先写opertor 在struct里面居然只能带一个变量?。。。
放到外面,然后还得加引用?
然后题目描述不清,重边怎么算?好吧,后来知道重边算两条。
然后没开ll,没取模各贡献一次WA。。。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set>10 #include<queue>11 #include<string>12 #define inf 100000000013 #define maxn 50014 #define maxm 500+10015 #define eps 1e-1016 #define ll long long17 #define pa pair<int,int>18 #define for0(i,n) for(int i=0;i<=(n);i++)19 #define for1(i,n) for(int i=1;i<=(n);i++)20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)22 #define for4(i,x) for(int i=head[x],y;i;i=e[i].next)23 #define mod 4598924 using namespace std;25 inline ll read()26 {27 ll x=0,f=1;char ch=getchar();28 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}29 while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}30 return x*f;31 }32 int n,m,s,tot,cnt,num[maxn],c[maxn][2];33 struct matrix34 {35 int d[maxn][maxn];36 matrix(){memset(d,0,sizeof(d));}37 }a,b;38 inline matrix operator *(matrix &x,matrix &y)39 {40 matrix z;41 for1(i,m)42 for1(j,m)43 for1(k,m)44 (z.d[i][j]+=x.d[i][k]*y.d[k][j])%=mod;45 return z;46 }47 inline void print(matrix x)48 {49 for1(i,m)for1(j,m)cout<<i<<‘ ‘<<j<<‘ ‘<<x.d[i][j]<<endl;50 }51 void ksm(ll y)52 {53 for(;y;y>>=1,a=a*a)54 if(y&1)b=b*a;55 }56 int main()57 {58 freopen("input.txt","r",stdin);59 freopen("output.txt","w",stdout);60 n=read();m=read();s=read();ll q=read();tot=1;61 for1(i,m)62 {63 int x=read(),y=read();64 c[++tot][0]=x;c[tot][1]=y;65 c[++tot][0]=y;c[tot][1]=x;66 }67 m=tot;68 for1(i,m)for1(j,m)if(i!=j&&i!=(j^1)&&c[i][1]==c[j][0])a.d[i][j]=1;69 for1(i,m)b.d[i][i]=1;70 ksm(q-1);71 for1(i,m)if(c[i][0]==s)num[++cnt]=i;72 for1(i,n)73 {74 int ans=0;75 for1(j,m)if(c[j][1]==i)76 for1(k,cnt)(ans+=b.d[num[k]][j])%=mod;77 printf("%d\n",ans);78 }79 return 0;80 }
3792: 跑步
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 48 Solved: 21
[Submit][Status]
Description
小白非常喜欢跑步,所以他经常在校园内跑步(其实是想看美女~)。校园可以看成由N个地区,由M个道路连接。我们小白早上从一个地点出发,但是不知道怎么跑才好。小白有个习惯,不会沿着刚刚经过的道路再返回(比如从A到B经过C道路,下一次,不会再沿着C从B返回A)。
小白想知道从他出发的地点,经过Q条路,到达每个点的方案数。这样方便他去选择。
Input
第一行3个整数N,M,S,Q。表示有N个地区,M条道路,从S出发,需要经过Q条路。
下面M行,每行两个整数表示A,B之间有条道路。
Output
一共N行,每行一个整数表示从S到I的方案数(mod 45989)
Sample Input
10 20 9 10
1 5
5 10
10 4
10 2
10 7
4 3
10 9
2 8
5 6
6 1
2 10
4 7
9 10
9 6
7 3
7 3
7 2
1 8
9 7
4 5
1 5
5 10
10 4
10 2
10 7
4 3
10 9
2 8
5 6
6 1
2 10
4 7
9 10
9 6
7 3
7 3
7 2
1 8
9 7
4 5
Sample Output
17420
41928
35701
40814
31937
22933
5754
15848
43620
10819
41928
35701
40814
31937
22933
5754
15848
43620
10819
HINT
N<=30 M<=60 Q<=10^16
BZOJ3792: 跑步
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。