Codeforces 1322C - Instant Noodles(数学)
题意
给出一个二分图, 两边各 n 个点, 共 m 条边, n, m ≤ 5e5. 右边的点具有权值 \(c_i\), 对于一个只包含左边的点的点集 S, 定义 N(S) 为所有与这个点集相邻的右边的点的点集, f(S) 为这些点的权值和. 问所有可能的 f(S) 的最大公因数.
思路
考虑若干个右边的点, 如果它们对应的左边的点是一致的, 说明它们在 N(S) 中一定是同时出现, 所以把它们缩成一个点, 新权值为原来的权值和. 缩点后在再除去那些度数为 0 的点, 下面证明答案就是剩下的点的权值的 gcd. 后面提到的 \(c_i\) 是已经过上述处理的.
设此时得到的答案为 g, 答案真值为 G. 显然 g 整除所有 f(S), 得到 \(g | G\). 设 \(G = k × g\). 令所有 \(c_i\) 都除以 \(g\). 假设 \(k > 1\), 则存在一个 \(c_j\), 使得 \(k \nmid c_j\), 设所有不与该点的相邻的点构成集合 S', 左边的点全集为 U, 则 N(S') 为仅不包含点 j 的右边点集合, 因为如果还有其他点也不被包含, 这与已缩点是矛盾的. 因为 \(k | f(U), k \nmid c_j\), 所以 \(k \nmid f(U-S')\), 得出矛盾. 所以 \(k = 1, g = G\).
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)
const int maxn = 5e5 + 5;
int t, n, m, u, v;
ll c[maxn];
vector<int> g[maxn];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> t;
while (t--) {
cin >> n >> m;
inc(i, 0, n - 1) vector<int>().swap(g[i]);
inc(i, 0, n - 1) cin >> c[i];
inc(i, 0, m - 1) {
cin >> u >> v;
u--, v--;
g[v].push_back(u);
}
inc(i, 0, n - 1) sort(g[i].begin(), g[i].end());
vector<int> id(n);
iota(id.begin(), id.end(), 0);
sort(id.begin(), id.end(), [&](int a, int b) { return g[a] < g[b]; });
ll res = 0;
for (int i = 0, j; i < n; i = j) {
ll sum = 0;
j = i;
while (j < n && g[id[i]] == g[id[j]]) {
sum += c[id[j]];
j++;
}
if (g[id[i]].size()) res = __gcd(res, sum);
}
cout << res << "\n";
}
}
Codeforces 1322C - Instant Noodles(数学)的更多相关文章
- Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)
题意: 给你一个二分图,求左侧端点的所有可能子集中的点相连的右侧端点的权值的和的最大公因数. 题解: 若所有右侧端点均不在同一左侧子集中,则求所有权值的最大公因数即可 . 否则,将在相同左侧子集中的右 ...
- CodeForces 534C Polycarpus' Dice (数学)
题意:第一行给两个数,n 和 A,n 表示有n 个骰子,A表示 n 个骰子掷出的数的和.第二行给出n个数,表示第n个骰子所能掷出的最大的数,这些骰子都有问题, 可能或多或少的掷不出几个数,输出n个骰子 ...
- codeforces 687B - Remainders Game 数学相关(互质中国剩余定理)
题意:给你x%ci=bi(x未知),是否能确定x%k的值(k已知) ——数学相关知识: 首先:我们知道一些事情,对于k,假设有ci%k==0,那么一定能确定x%k的值,比如k=5和ci=20,知道x% ...
- Codeforces Gym 100269G Garage 数学
Garage 题目连接: http://codeforces.com/gym/100269/attachments Description Wow! What a lucky day! Your co ...
- Codeforces C. Almost Equal (数学规律)
题目链接:http://codeforces.com/contest/1206/problem/C 题解 : 观察可以发现当n为偶数时,1 - 2n是不满足题意的,可以举例n = 2,n = 4试一试 ...
- codeforces 101C C. Vectors(数学)
题目链接: C. Vectors time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Educational Codeforces Round 15 D 数学推公式
D. Road to Post Office time limit per test 1 second memory limit per test 256 megabytes input standa ...
- CodeForces 589D Boulevard (数学,相遇)
题意:给定 n 个的在 x 轴上的坐标,和开始时间,结束坐标,从起点向终点走,如果和其他人相遇,就互相打招乎,问你每人打招乎的次数. 析:其实这一个数学题,由于 n 比较小,我们就可以两两暴力,这两个 ...
- Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...
随机推荐
- 从头认识js-HTML中使用JavaScript
<script>元素 在HTML页面中插入Javascript的主要办法就是使用<script>元素,HTML4.01为<script>定义了下列6个属性. 1.a ...
- [Python之路] object类中的特殊方法
一.object类的源码 python版本:3.8 class object: """ The most base type """ # d ...
- PHP时区转换(默认中国时区<Asia/Shanghai>转意大利时区<Europe/Rome>)
<?php function changeTimeZone($date_time, $format = 'Y-m-d H:i:s', $to = 'Europe/Rome', $from = ' ...
- 大厂常问iOS面试题--性能优化篇
1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候 ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...
- 线程(Thread)的四种停止方式
1.正常的程序启动,停止 2.使用退出标记,一般程序在run()方法后,线程会正常结束.但是有一些伺服线程还在运行,他们运行时间较长,只有当外部条件满足时,他们才会停止.实现如下: public cl ...
- 第二篇:如何安装Linux,虚拟机安装Linux
安装Linux的方法挺多,但是这里咱们只说一种:如何在虚拟机里安装运行Linux. 想必看此类文章的都是小白,所以下面我就写的通俗易懂点. 第一步:下载虚拟机软件.(虚拟机软件是啥?它 ...
- RTOS文件系统对比:LittleFS Vs. SPIFFS
概述 在RTOS上免费的文件系统本身就不多,广泛使用且掉电安全的就更少了.本文选取当前RTOS上比较受欢迎的两个文件系统 SPIFFS 和 LittleFS 做全方位的对比,以便项目上评估在RTOS上 ...
- ggplot之多变量绘图
1. 普通plot 准备数据. x<-seq(0,2*pi,0.05) y<-sin(x) z<-cos(x) data<-data.frame(x,y,z) plot: pl ...
- 机器学习——详解经典聚类算法Kmeans
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第12篇文章,我们一起来看下Kmeans聚类算法. 在上一篇文章当中我们讨论了KNN算法,KNN算法非常形象,通过距离公 ...