Lightoj1356
题目链接:https://vjudge.net/problem/LightOJ-1356
题目大意:
T个 test case,每个 test case 给出一个 N 个数的集合。请找出一个最大的子集,使得子集中的任何一个数除以子集中的任意的另一个数所得到的数不是质数。
解题思路:
先用素数筛找出 1 到 500000 的所有质数。
在输入一个集合的时候,我们顺便记录下输入的这个数在输入数组中的位置,找出它的所有质因数,记录下质因数的总个数,用一个vector记录下所有 “不同的” 质因数。
遍历输入数组中的每一个数,对于每个数,遍历其所有 “不同的” 质因数,如果找到这样的一个质因数:该数除以这个质因数能得到输入数组中的另一个数,那么将这两个数连边。
将由上述的连边操作得到的图中的点分成两类:质因数总个数为奇数的点和质因数总个数为偶数的点(这个划分有点隐晦,我多说两句:其实,对于连边的两个数,二者各自的所有质因数其实就只有一个质数的差别,其中一个数的所有质因数中有这个质数,但另一个数没有,其他的质因数都相同;所以,他们质因数的总个数相差 1,故其中一个为奇数,一个为偶数),这样一来,这个图就变成一个二分图了。而答案其实就是求这个二分图的最大独立集。
另:用匈牙利算法者,T!用 Hopcroft-Carp者方有可能AC。
AC代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue> using namespace std;
const int inf=0x3f3f3f3f; bool prime[];
int have[],num[];
int prims[]; vector<int> G[];
int uN;
int l[];
int Mx[],My[];
int dx[],dy[];
int dis;
bool used[];
bool SearchP(){
queue<int>Q;
dis=inf;
memset(dx,-,sizeof(dx));
memset(dy,-,sizeof(dy));
for(int i=;i<uN;i++){
if(Mx[l[i]]==-){
Q.push(l[i]);
dx[l[i]]=;
}
}
while(!Q.empty()){
int u=Q.front();
Q.pop();
if(dx[u]>dis) break;
int sz=G[u].size();
for(int i=;i<sz;i++){
int v=G[u][i];
if(dy[v]==-){
dy[v]=dx[u]+;
if(My[v]==-) dis=dy[v];
else{
dx[My[v]]=dy[v]+;
Q.push(My[v]);
}
}
}
}
return dis!=inf;
}
bool DFS(int u){
int sz=G[u].size();
for(int i=;i<sz;i++){
int v=G[u][i];
if(!used[v]&&dy[v]==dx[u]+){
used[v]=true;
if(My[v]!=-&&dy[v]==dis) continue;
if(My[v]==-||DFS(My[v])){
My[v]=u;
Mx[u]=v;
return true;
}
}
}
return false;
}
int MaxMatch(){
int res=;
memset(Mx,-,sizeof(Mx));
memset(My,-,sizeof(My));
while(SearchP()){
memset(used,false,sizeof(used));
for(int i=;i<uN;i++){
if(Mx[l[i]]==-&&DFS(l[i])) res++;
}
}
return res;
}
void init(){
memset(prime,true,sizeof(prime));
prime[]=prime[]=false;
int cnt=;
for(int i=;i<=;i++){
if(prime[i]){
prims[cnt++]=i;
for(int j=*i;j<=;j+=i)
prime[j]=false;
}
}
}
int zhis[];
vector<int> zhiyinshu[];
int main(){
init();
int T,N;
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&N);
memset(have,,sizeof(have));
memset(zhis,,sizeof(zhis));
for(int i=;i<=N;i++){
G[i].clear();
zhiyinshu[i].clear();
scanf("%d",&num[i]);
have[num[i]]=i;
int tmp=num[i];
for(int j=;;j++){
if(prime[tmp]){
zhiyinshu[i].push_back(tmp);
zhis[i]++;
break;
}
if(tmp%prims[j]==){
tmp/=prims[j];
zhiyinshu[i].push_back(prims[j]);
zhis[i]++;
while(tmp%prims[j]==){
tmp/=prims[j];
zhis[i]++;
}
}
if(tmp<prims[j]) break;
}
}
for(int i=;i<=N;i++){
for(int j=;j<zhiyinshu[i].size();j++){
if(have[num[i]/zhiyinshu[i][j]]){
int u=have[num[i]/zhiyinshu[i][j]];
G[i].push_back(u);
G[u].push_back(i);
}
}
} uN=;
for(int i=;i<=N;i++){
if(zhis[i]%==){
l[uN++]=i;
}
}
printf("Case %d: %d\n",t,N-MaxMatch());
}
return ;
}
Lightoj1356的更多相关文章
- Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
题意: 找出一个集合中的最大独立集,任意两数字之间不能是素数倍数的关系. 思路: 最大独立集,必然是二分图. 最大数字50w,考虑对每个数质因子分解,然后枚举所有除去一个质因子后的数是否存在,存在则建 ...
随机推荐
- build.gradle 详解(一)
简述: 1) Java 开发中有两个大名鼎鼎的项目构建 ANT.Maven. 2) Google 推荐使用的 Android studio 是采用 Gradle 来构建项目.Gradle 是一个非常先 ...
- SpringCloud入门(十一):Sleuth 与 Zipkin分布式链路跟踪
现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文<Dapper, a Large-Scale Distributed Systems Tracing Infrastructu ...
- 《图解 HTTP》 摘要一
学习过程对书本的内容的摘要以及总结,逐步完善,带有个人理解成分. Web 及网络基础 使用 HTTP 协议访问 Web 客户端:通过获取请求获取服务资源的 Web 浏览器等 HTTP 全称:Htype ...
- sed命令的正则表达式实践
1. 取系统ip [root@oldboy logs]# ifconfig eth3 eth3 Link encap:Ethernet HWaddr 08:00:27:4C:6F:AD inet ad ...
- POJ1651:Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...
- Eclipse Mac OS 安装 Subversion插件subclipse 缺失JavaHL解决方案
安装 SVN 插件 subclipse 时可能遇到问题 subclipse 安装完成后,当我们选择使用 的时候还是会提示:javaHL not available, SVN接口选择 client:选择 ...
- 配置windows自动修改密码和自动登录
日常运维多台服务器,每季度要修改一次密码,非常麻烦,现做一个VBS脚本,计划任务设置每季度第一天三点定时运行,则可解决该问题,具体实现脚本如下:autochg_pwd.vbs ystr=year(No ...
- 全面解析Java语言 Java技能优化集锦
通用篇 "通用篇"讨论的问题适合于大多数Java应用. 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了C ...
- C语言编程入门题目--No.10
题目:打印楼梯,同时在楼梯上方打印两个笑脸. 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数. 2.程序源代码: #include "stdio.h" ...
- 分享一批国内常用的tracker地址
本期先分享一批国内能用地址,下一期我会出一期取代迅雷的下载的工具教程. udp://p4p.arenabg.com:1337/announce udp://tracker.tiny-vps.com:6 ...