「CodeForces-498C」Array and Operations(数论+网络流)

「CodeForces-498C」Array and Operations
给定n个点和m个边集,每次操作可以将相连边的两个点值同时除以一个公约数,问最大操作次数

题意

给定一个长为$n$的数组,以及$m$对下标为$(a,b)$的点对,且满足下标a+b为奇数(即奇数点只与偶数点匹配),每次操作可以将同一组的两个数同时除以一个公约数,问最多能进行多少次操作。

解法

显然题目所给的是一个二分图。

对于每个质因数分开考虑。对于奇数点,向源点连接一个容量为该因子个数的边;对于偶数点,则向汇点建立一个容量为因子数的边;对于有边相连的点对,建立容量为$inf$的边。

对于题给的数组$a[i]$,通过分解质因数的方式计算每个质因数所建图的最大流,求和即为所求解。

代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
#include <cstring>#include <algorithm>#include <queue>

using namespace std;

const int MAX_V=200+10;const int INF=0x3f3f3f3f;

struct {int to,cap,rev;};

vector<edge> G[MAX_V];	//图的邻接表表示int level[MAX_V];	//顶点到源点的距离标号int iter[MAX_V];	//当前弧

void add(int from,int to,int cap){	G[from].push_back((edge){to,cap,G[to].size()});	G[to].push_back((edge){from,0,G[from].size()-1});}

//计算从源点出发的距离标号void bfs(int s){	memset(level,-1,sizeof(level));	queue<int> que;	level[s]=0;	que.push(s);	while(!que.empty())	{		int v=que.front();que.pop();		for(int i=0;i<G[v].size();i++)		{			edge &e=G[v][i];			if(e.cap>0&&level[e.to]<0)			{				level[e.to]=level[v]+1;				que.push(e.to);			}		}	}}

//通过DFS寻找增广路int dfs(int v,int t,int f){	if(v==t) return f;	for(int &i=iter[v];i<G[v].size();i++)	{		edge &e=G[v][i];		if(e.cap>0 && level[v]<level[e.to])		{			int d=dfs(e.to,t,min(f,e.cap));			if(d>0)			{				e.cap-=d;				G[e.to][e.rev].cap+=d;				return d;			}		}	}	return 0;}

//求解从s到t的最大流int max_flow(int s,int t){	int flow=0;	for(;;)	{		bfs(s);		if(level[t]<0) return flow;		memset(iter,0,sizeof(iter));		int f;		while((f=dfs(s,t,INF))>0) flow+=f;	}}

int n,m,a[105],u[105],v[105],s,t,ans=0;

void solve(int x){    for(int i=0;i<MAX_V;i++) G[i].clear();    for(int i=1;i<=n;i++)    {        int tot=0;        while(a[i]%x==0) a[i]/=x,tot++;        if(i%2) add(s,i,tot);        else add(i,t,tot);    }    for(int i=0;i<m;i++) add(u[i],v[i],INF);    ans+=max_flow(s,t);}

int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)        scanf("%d",&a[i]);    for(int i=0;i<m;i++)    {        scanf("%d%d",&u[i],&v[i]);        if(v[i]&1) swap(u[i],v[i]);    }    s=0,t=n+1;    for(int i=1;i<=n;i++)    {        for(int j=2;j*j<=a[i];j++)            if(a[i]%j==0) solve(j);        if(a[i]>1) solve(a[i]);    }    printf("%dn",ans);    return 0;}

原文:大专栏  「CodeForces-498C」Array and Operations(数论+网络流)

原文地址:https://www.cnblogs.com/chinatrump/p/11597073.html

时间: 2024-08-30 03:16:05

「CodeForces-498C」Array and Operations(数论+网络流)的相关文章

「Codeforces 148D」Bag of mice

袋子里有 \(w\) 只白鼠和 \(b\) 只黑鼠 ,\(A\) 和 \(B\) 轮流从袋子里抓,谁先抓到白色谁就赢.\(A\) 每次随机抓一只,\(B\) 每次随机抓完一只之后会有另一只随机老鼠跑出来.如果两个人都没有抓到白色则 \(B\) 赢.\(A\) 先抓,问 \(A\) 赢的概率. Luogu 分析 不会概率 DP .....使用记忆化搜索. 我们记 \(f[i][j]\) 为当前还剩 \(i\) 个白鼠 \(j\) 个黑鼠 \(A\) 赢的概率. \(dfs(n, m)\) , \(

loj #6091. 「Codeforces Round #418」幻想特快

#6091. 「Codeforces Round #418」幻想特快 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using namespace std; 7 #define maxn 10000 8 int n,a[maxn],b[maxn],p[maxn],nxt1,nxt2,tot,

codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-14) Description In mathematical terms, the sequence Fn of Fibonacci numbers is defi

CodeForces E. Lucky Array 幸运数列

CodeForces    E. Lucky Array  幸运数列 Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are n

微信小程序开发基础(一)「配置」与「逻辑层」

微信小程序作为微信生态重要的一环,在实际生活.工作.商业中的应用越来越广泛.想学习微信小程序开发的朋友也越来越多,本文将在小程序框架的基础上就微信小程序项目开发所必需的基础知识及语法特点进行了详细总结和阐述,包括配置.函数.语法.事件及其处理.数据绑定.模块.样式等.想开发小程序,这些内容是必须掌握的. 全文知识结构预览: 一.程序配置: 1.全局配置:2.页面配置 二.逻辑层: 1.程序注册:App()方法:2.页面注册:Page()方法:3.模块与调用:4.微信原生API 三.视图层(将在单

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

Chrome 扩展 Stylish :给不喜欢某个网站一键「换肤」

原文地址:http://whosmall.com/?post=419 本文标签: Chrome扩展 Chrome浏览器 Chrome插件 Chrome扩展Stylish Stylish是什么 Stylish 是什么? 开门见山,Stylish 的作用是,它可以把百度首页变成这样: 它还能把知乎「拍扁」,让微博网页版变得简洁无比,让 Feedly 用上Material Design-- 这个神奇的 Stylish实际上是一个浏览器插件,适用于 Chrome,Firefox,Opera 以及 Saf

codeforces 482B. Interesting Array【线段树区间更新】

题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val.就是区间l---r上的与的值为val,最后问你原来的数组是多少?如果不存在输出no 分析:分析发现要满足所有的区间,而一个点上假如有多个区间的话,这个点的值就是所有区间或的值,因为只有这样才能满足所有区间的,把所有位上的1都保存下来了,那么可以发现用线段树来维护,但是那么怎么判断满不满足条件呢?可以也用线段树,更新了之后在整个维护一遍看看满不满足题意,如