BZOJ 3308 毒瘤结论 网络流
结论:在答案集合中的数其质因数最多有两个 且有两个的话一个>n1/2一个<n1/2
这样我们就可以把所有质数筛出来 弄成二分图 左边是<n1/2右边是>n1/2的
所以先把单个质因子的答案全部加上 再考虑两个质因子的一个数会不会比一个质因子的两个数更优
如果更优 则建边 再求最大流
注意最后答案要加上特殊的1
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=;
const int inf=0x7fffffff;
int n,val[N],cnt,prime[N],tot,last[N],s,t,dis[N],pre[N];
struct edge{int to,from,c,w,next;}e[N*];
queue <int> q;
bool not_prime[N],vis[N];
LL ans;
void get_prime(int n)
{
for (int i=;i<=n;i++)
{
if (!not_prime[i]) prime[++tot]=i;
for (int j=;j<=tot&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=;
if (i%prime[j]==) break;
}
}
} int get_val(int x,int y)
{
if (x*y>n) return ;
int w=x;
while ((LL)w*x*y<=(LL)n) w*=x;
return w*y;
} void addedge(int u,int v,int c,int w)
{
e[++cnt].from=u;e[cnt].to=v;e[cnt].c=c;e[cnt].w=w;e[cnt].next=last[u];last[u]=cnt;
e[++cnt].from=v;e[cnt].to=u;e[cnt].c=;e[cnt].w=-w;e[cnt].next=last[v];last[v]=cnt;
} bool spfa()
{
for (int i=s;i<=t;i++) dis[i]=-inf;
dis[s]=;vis[s]=;q.push(s);
while (!q.empty())
{
int u=q.front();q.pop();
for (int i=last[u];i;i=e[i].next)
if (e[i].c&&dis[u]+e[i].w>dis[e[i].to])
{
dis[e[i].to]=dis[u]+e[i].w;
pre[e[i].to]=i;
if (!vis[e[i].to]) q.push(e[i].to),vis[e[i].to]=;
}
vis[u]=;
}
if (dis[t]==-inf) return ;
else return ;
} void mcf()
{
if (dis[t]>) ans+=dis[t];
int x=t;
while (x!=s)
{
e[pre[x]].c--;
e[pre[x]^].c++;
x=e[pre[x]].from;
}
} int main()
{
scanf("%d",&n);
get_prime(n);
int w=sqrt(n);
while (prime[tot]>n/) ans+=prime[tot],tot--;
s=;t=tot+;cnt=;
for (int i=;i<=tot;i++)
{
ans+=val[i]=get_val(prime[i],);
if (prime[i]<=w) addedge(s,i,,);
else addedge(i,t,,);
}
for (int i=;i<=tot&&prime[i]<=w;i++)
for (int j=tot;j&&prime[j]>w;j--)
{
int v=get_val(prime[i],prime[j]);
if (v>val[i]+val[j]) addedge(i,j,,v-val[i]-val[j]);
}
while (spfa()) mcf();
printf("%lld",ans+);
return ;
}
BZOJ 3308 毒瘤结论 网络流的更多相关文章
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
3308: 九月的咖啡店 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 244 Solved: 86 Description 深绘里在九份开了一家咖 ...
- bzoj 3308 九月的咖啡店
题目大意: 求若干个<=n的数 两两互质 使和最大 求这个最大的和 思路: 显然,得到两个结论 1 最终的所有数都只能分解为两个质因数 2 这两个质因数 一个<根号n 一个>根号n ...
- BZOJ 1443 二分图博弈 网络流
思路: 二分图博弈嘛 找到最大匹配的必须点 跑个网络流 前后DFS一遍 //By SiriusRen #include <queue> #include <cstdio> #i ...
- HDU 6735 结论网络流 机器人不重叠路径
我们可以得到一个结论:没有两个机器人走过的路会重叠 所以题目就转变为了能不能让机器人的路径不重叠且每个机器人能到达终点 直接一个点朝他四连通方向的四个点连容量为1的边即可 #include<bi ...
- Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1105 Solved: 331[Submit][Statu ...
- BZOJ 1458: 士兵占领( 网络流 )
先判无解 把整个棋盘都放上士兵, 只需求最多可以拿走多少个士兵即可.每一行看做一个点r(i), 每一列看做一个点c(i) S->r(i), c(i)->T 连边, 容量为可以拿走的最大士兵 ...
- BZOJ 1391 [CEOI] Order - 网络流 最大流
Solution 非常简单的建边!!! 但是刚开始的代码不够体现社会主义的优越性, 于是我 .... 惨痛教训啊... 终于到了今天才能够体现社会主义优越性... Code #include<c ...
随机推荐
- 配置Linux描述网络安全CIA模型之可用性案例
在Linux中防御SYN型DOS攻击的方法比较常见的有: 1.增大队列SYN最大半链接数 2.利用SYN cookie技术 下面分别进行分析. 1.增大队列SYN最大半连接数 在LINUX中执行命 ...
- 【转】git2.9.2使用总结
git2.9.2使用总结 1.系统:Windows7 2.git版本:2.9.2 由于我的git版本是最新版,后面我出现的坑就是最新版本的问题. 3.托管环境:开源中国的码云 . 使用步骤 1.在码云 ...
- 48.javascript基础学习
javascript基础学习: http://www.w3school.com.cn/jsref/index.asp jS的引入方式: 1.行间事件:为某一个具体的元素标签赋予js内容,oncli ...
- linux 环境下jmeter+ant+jenkins
一.linux下的jenkins的安装: 下载链接:https://pan.baidu.com/s/1qZItZOC 密码:58da Jenkins 下载网址: http://jenkins-ci.o ...
- EF-初识
什么是ORM 起源随着编程的发展,程序里都是面向对象啥的,但是数据库发展呢 网状数据库 ->层次数据库 ->关系数据库(当然还有nosql数据库 我们只是做热数据缓存 后面将会讲到) ...
- 路由器02---PandoraBox配置
1.安装libc 什么是libc,这里贴一个gnu官方的解释 Any Unix-like operating system needs a C library: the library which d ...
- Windows注册表中修改UAC(用户账号控制)及批处理脚本
注册表路径: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 键说明: ConsentProm ...
- nginx设置导航&安装showdoc&创建文件服务&zabbix&grafana
安装环境: [root@nginx showdoc]# cat /etc/centos-release #系统版本 CentOS Linux release 7.5.1804 (Core) [root ...
- Python复习笔记02
语句表达式: 在Python中支持遍历循环的对象:可迭代器对象,支持迭代协议的对象 比如列表list没有迭代功能只是可迭代对象 迭代:迭代协议 --> 例:f.__next__() 属于f的迭代 ...
- c语言 运算器
#include<stdio.h> #include<stdbool.h> void menu(){ printf("************************ ...