voteplus
【问题描述】
R 君博客上有⼀个投票板块,⼤家可以使⽤投票的⽅式来表达⾃⼰对某些问题的赞成或反对的意见。
投票结果是公开的,但是 R 君会把这个结果化成⼀个最简分数,如 1:2,4:3。
注意到同⼀个最简分数可能代表了不同的总⼈数,如: 300 ⼈赞同, 600⼈反对与 1 ⼈赞同, 2 ⼈反对显⽰的都是 1:2。
Neetenin 同学发现了这⼀点,但是 Neetenin 同学想猜出有多少⼈参加了投票,他使⽤的⽅法是先看结果,⾃⼰投⼀票赞同后再看结果。
⽐如⼀个当前的投票结果是 1:2,但是 Neetenin 同学投了⼀票赞成后变成了 301:600, Neetenin 同学就知道⼀共有 300+600+1=901 ⼈参加了此次投票。
现在 Neetenin 同学把之前和之后的结果都告诉你,让你算算⼀共有多少⼈参加了投票!
当然, Neetenin 可能也有看错了的时候,所以当问题⽆解的时候请输出”fake”(不含双引号)。
【输入格式】
⼀⾏四个整数 a,b,c,d,表⽰前⼀次结果是 a:b,后⼀次结果是 c:d。
【输出格式】
输出⼀个整数或⼀个字符串”fake”(不含双引号),表⽰参加投票的总⼈数,包含 Neetenin 同学。
【样例输入 1】
1 4 1 3
【样例输出 1】
16
【样例输入 2】
1 3 1 4
【样例输出 2】
fake
【数据规模及约定】
对于前 50% 的数据, 1 ≤ a; b; c; d ≤ 100000。
对于前 50% 的数据, 1 ≤ 答案 ≤ 100000。
对于前 100% 的数据, 1 ≤ a; b; c; d ≤ 10^9。
对于前 100% 的数据, 1 ≤ 答案 ≤ 10^9。
【题解】
设之前是x人投赞成,y人反对,那么不难列出\(\displaystyle\frac x y=\frac a b,\frac{x+1}y=\frac c d\)。
把这个方程组乱搞搞,就能得到\(\displaystyle x=\frac{ad}{bc-ad},y=\frac{bd}{bc-ad}\)。
判断\(bc-ad>0\),并且ad和bd都能整除即可输出,否则当然是fake了
fire
【问题描述】
森林着⽕了,⽕势还在不断蔓延。
R 君作为森林管理员,看到⽕势失去控制、在森林中四处蔓延,⼼⾥很慌。
经过 R 君平⽇仔细的研究,这个森林的⽕势传播可以看成⼀个 n 个节点的带边权的⽆向图 (节点标号为 1-n),每个节点代表森林的⼀个区域,⼀条边 (u,v,w) 代表着⽕势从区域 u 传播到区域 v 需要花费 w 的时间。并且整个森林是⼀个连通图,⼀旦着⽕,没有节点可以幸免。
通过⾃动化的 IoT 设备, R 君观察到了 0 时刻有 k 处起⽕点,然后⼤⽕就按照⽕势传播图的规则蔓延开来。
不幸的是森林⾥有 q 个区域存在着居民,所以 R 君⾮常想知道⽕势蔓延到这 q 个区域的时间从⽽展开营救⾏动。
然⽽ R 君觉得这个问题太难了,于是找到了学 OI 的你。
【输入格式】
第⼀⾏四个整数 n, m, k, q,表⽰图的点数、边数、起⽕点数量、存在居民的区域数量。
接下来 m ⾏,每⾏三个正整数 u, v, w,表⽰⼀条 u 到 v,边权为 w 的⽆向边。
接下来⼀⾏ k 个正整数,表⽰ 0 时刻 k 个起⽕点的节点编号。
接下来⼀⾏ q 个正整数,表⽰询问的 q 个居民区的节点编号。
【输出格式】
输出 q ⾏,每⾏⼀个整数,表⽰⽕势蔓延到该点的时间。
【样例输入】
5 5 2 5
1 2 5
1 3 2
2 3 5
2 4 5
3 5 2
2 5
5 4 3 2 1
【样例输出】
0 5 2 0 4
【数据规模及约定】
对于前 10% 的数据, 1 ≤ n ≤ 100。
对于另外 20% 的数据,图为⼀棵树。
对于另外 20% 的数据, k=1。
对于另外 20% 的数据, q=1。
对于前 100% 的数据, 1 ≤ n; m ≤ 10000, 1 ≤ k; q; u; v ≤ n, 1 ≤ w ≤10000。
【题解】
建立一个炒鸡src,向所有着火的点连边权为0的边跑最短路。实际操作的时候可以直接把所有着火的点的dis设为0并放到堆中跑dij。
matrix
【问题描述】
⼩ Y ⼗分喜欢计数,⼀天他遇到了这样的⼀个问题:
有⼀个 n ⾏ m 列的矩阵,刚开始每个位置的数字都是 0。⼩ Y ⾸先进⾏ r 次这样的操作,选择⼀⾏ (可与之前选择重复) 把这⼀⾏的每个数字+1。之后⼩ Y 进⾏ c 次这样的操作,选择⼀列 (可与之前选择重复) 把这⼀列的每个数字 +1。
最后⼩ Y 数了⼀下,矩阵⾥总共有 k 个位置的数字是奇数。
但是⼩ Y 忘了之前是怎么操作的了,所以现在⼩ Y 想知道有多少种操作⽅案能够使得最后⼀共有 k 个位置的数字是奇数。
两种操作⽅案不同当且仅当存在某⾏或某列进⾏操作的次数不同。
因为答案很⼤,所以只需输出这个答案除以 109 + 7 的余数。
【输入格式】
输⼊包含⼀⾏五个空格隔开的整数, n,m,r,c,k。
【输出格式】
输出包含⼀个整数,表⽰答案。
【样例输入】
2 2 2 2 4
【样例输出】
4
【数据规模和约定】
对于 20% 的数据, 1 ≤ n; m; r; c ≤ 4;
对于 50% 的数据, 1 ≤ n; m; r; c ≤ 2000;
对于 100% 的数据, 1 ≤ n; m; r; c ≤ 10^5; 0 ≤ k ≤ nm。
【题解】
很值得思考很有趣的一道题。
我们先假设矩阵操作后,有x行操作了奇数次,有y列操作了奇数次。
那么不难列出x(m-y)+y(n-x)=k,即mx+ny=k+2xy。我们可以枚举x而推出y,从而得出所有合法的x和y。这里给出根据x求y的式子:\(\displaystyle y=\frac{k-mx}{n-2x}\),很容易推出来。
但是我们观察到分母是\(n-2x\),如果\(n-2x=0\)那么怎么办?
我们可以考虑,当\(n-2x=0\)时,相当于操作完所有的行后,恰好有一半的行是奇数,另一半的行是偶数。那么如果再操作列,奇数元素的数量是不改变的。。所以当2k=mn时,y可以取任意合法值,否则y无解。
注意到还有\(m-2y=0\)的情况,也要考虑一下。我们可以直接枚举x求y枚举y求x,把所有合法的(x,y)塞到一个set里不就得了。。。其实最完美的做法是只枚举x,并判断那种情况。但是这里再告诉你一个事实,其实那种情况只需要判断是否有2k=mn即可,如果有,那么那种情况一定存在,且其他情况不存在。这个结论可以通过GeoGebra探索出来。
我们处理出所有合法的(x,y)后,就枚举刚才处理的所有(x,y)并计算贡献。显然的是行和列的贡献是独立的,这里只考虑行的贡献。首先我们一共有n行,最后有x行被操作奇数次,那么方案数为\(\mathrm{C}_{n}^x\)。我们先把这x次操作干完,然后剩下的就可以每两个操作组成一对去操作同一行,操作完成之后那行还是偶数,一共有\(\displaystyle\frac {r-x}{2}\)个操作对。由于每一行可以操作多次,那么就是多重集的组合数:\(\mathrm{C}_{n+\frac{r-x}{2}-1}^{\frac{r-x}{2}}\)了。
所以最后一个(x,y)的贡献为\(\mathrm{C}_{n}^x\times\mathrm{C}_{n+\frac{r-x}{2}-1}^{\frac{r-x}{2}}\times\mathrm{C}_{m}^y\times\mathrm{C}_{m+\frac{c-y}{2}-1}^{\frac{c-y}{2}}\)。答案为所有(x,y)的贡献。
注意如果\(r-x\)或者\(c-y\)不是偶数,那么贡献为0