博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1356 Prime Independence( Hopcroft–Karp Bipartite算法)
阅读量:5941 次
发布时间:2019-06-19

本文共 1578 字,大约阅读时间需要 5 分钟。

题目链接:

题意:给定n个数,找到一个最大的集合使得集合中不存在任意两个数a和b,使得b=a*k(k为素数)。

思路:对于每个数x定义f(x),若x=p1^e1*………pt^et。f(x)=e1+e2+……et。那么可知,若两个数a和b满足b=a*k(k为素数),则f(a)和f(b)的奇偶性必然不同。据此建立二分图,设最大匹配为x,则 答案为n-x。

#include 
#include
#include
#define max(x,y) ((x)>(y)?(x):(y))#define i64 long long#define u32 unsigned intusing namespace std; int C,Num=0; const i64 MAX=500005;bool tag[MAX];int prime[MAX/10],cnt;int p[MAX]; void init(){ int i,j; for(i=2;i<710;i++) if(!tag[i]) { prime[cnt++]=i; for(j=i+i;j<710;j+=i) tag[j]=1; } for(i=2;i
='0'&&c<='9');c=getchar()); x=c-'0'; while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';} int main(){ init(); for(scanf("%d",&C);C--;) { read(n); int i,j,k,t; memset(b,0,sizeof(b)); for(i=1;i<=n;i++) { read(a[i]); b[a[i]]=i; } for(i=1;i<=n;i++) head[i]=-1; e=0; int pr[25],prNum; for(i=1;i<=n;i++) { t=a[i]; prNum=0; for(j=0;j
<=t;j++) if(t%prime[j]==0) { pr[++prNum]=prime[j]; while(t%prime[j]==0) t/=prime[j]; } if(t>1) pr[++prNum]=t; for(j=1;j<=prNum;j++) { k=a[i]/pr[j]; if(!b[k]) continue; if(p[a[i]]&1) Add(b[a[i]],b[k]); else Add(b[k],b[a[i]]); } } printf("Case %d: %d\n",++Num,n-MaxMatch()); } return 0;}

  

 

转载地址:http://lemtx.baihongyu.com/

你可能感兴趣的文章
XILINX_zynq_详解(6)
查看>>
计算机网络术语总结4
查看>>
新手小白 python之路 Day3 (string 常用方法)
查看>>
soapUI的简单使用(webservice接口功能测试)
查看>>
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
(原創) 如何建立一个thread? (OS) (Linux) (C/C++) (C)
查看>>
<气场>读书笔记
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>