bzoj 4602: [Sdoi2016]齿轮

传送门

题解:

一个简单的dfs或并查集即可搞定。

dfs做法:建出图来以后,由一个节点跑一遍,如果儿子节点没有被遍历过,dfs此节点,否则,判断他俩的比例与他俩到根节点的比例之比是否相等。

对于判断两节点的比例,double可以安全存下。

我怕炸精度(其实不会,感觉自己跟个zz一样),于是想不用double,用个pair存下分子分母。后来觉得导起来太麻烦,于是用逆元求(越来越傻了)。

逆元不需要太大的素数,大了会T,小了会WA。

bzoj上测试了5个素数:1000000007,66191,7307,233,151,103.测试结果如下。

附上代码:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 #define ll long long
 9 struct tree{
10     int u,v,next;
11     ll d;
12 }l[20100];
13 ll mod=151,dis[1010];
14 int lian[20100],n,m,t,e;
15 bool pd[1010],cuo;
16 ll ksm(ll,ll);
17 void bian(int,int,ll);
18 void dfs(int,int);
19 int main()
20 {
21 //    freopen("in.txt","r",stdin);
22     scanf("%d",&t);
23     for(int jjj=1;jjj<=t;jjj++)
24     {
25         memset(dis,0,sizeof(dis));
26         memset(lian,0,sizeof(lian));
27         memset(pd,0,sizeof(pd));
28         e=0;cuo=0;
29         scanf("%d%d",&n,&m);
30         for(int i=1;i<=m;i++)
31         {
32             int x,y,u,v;
33             scanf("%d%d%d%d",&x,&y,&u,&v);
34             bian(x,y,(ll)v*ksm(u,mod-2)%mod);
35             bian(y,x,(ll)u*ksm(v,mod-2)%mod);
36         }
37         for(int i=1;i<=n;i++)
38         {
39             if(pd[i]==0)
40             {
41                 dis[i]=1;
42                 dfs(i,i);
43                 if(cuo==1) break;
44             }
45         }
46         printf("Case #%d: ",jjj);
47         if(cuo==0) printf("Yes\n");
48         else printf("No\n");
49     }
50     return 0;
51 }
52 ll ksm(ll x,ll y)
53 {
54     ll z=x,sum=1;
55     while(y)
56     {
57         if(y&1)
58             sum=sum*z%mod;
59         y>>=1;
60         z=z*z%mod;
61     }
62     return sum;
63 }
64 void bian(int x,int y,ll z)
65 {
66     e++;
67     l[e].u=x;
68     l[e].v=y;
69     l[e].d=z;
70     l[e].next=lian[x];
71     lian[x]=e;
72 }
73 void dfs(int x,int fa)
74 {
75     for(int i=lian[x];i;i=l[i].next)
76     {
77         int v=l[i].v;
78         if(v==fa) continue;
79         if(pd[v]==0)
80         {
81             dis[v]=dis[x]*l[i].d%mod;
82             pd[v]=1;
83             dfs(v,x);
84         }
85         else
86         {
87             ll d=ksm(dis[x],mod-2)*dis[v]%mod;
88             if(d!=l[i].d) cuo=1;
89         }
90     }
91 }

时间: 2024-10-12 14:04:43

bzoj 4602: [Sdoi2016]齿轮的相关文章

4602: [Sdoi2016]齿轮

4602: [Sdoi2016]齿轮 Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈.传动比为正表示若编号 为u的齿轮顺时针转动,则编号为v的齿轮也顺时针转动.传动比为负表示若编号为u的齿轮顺时针转动,则编号为v 的齿轮会逆时针转动.若不同链条的传动比不相容,则有些齿轮无法转动.我们希望知道,系统中的这N个组合齿 轮能否同时转动.

[Sdoi2016]齿轮

4602: [Sdoi2016]齿轮 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 613  Solved: 324 [Submit][Status][Discuss] Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈.传动比为正表示若编号 为u的齿轮顺时针转动,则编号为v的齿轮也

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

图论(费用流):BZOJ 4514 [Sdoi2016]数字配对

4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 820  Solved: 345[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的价值. 一个数字只能参与一次配对,可以不参与配对. 在

数学(错排):BZOJ 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第

搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status][Discuss] Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量.所以,整个表格储存的总能量是, 随着时间的推移,格子中的能量会渐渐减少.一个时间

BZOJ 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第

BZOJ 4514: [Sdoi2016]数字配对

4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的价值. 一个数字只能参与一次配对,可以不参与配对.

动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途

4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 532  Solved: 337[Submit][Status][Discuss] Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他