题目大意:

求若干个<=n的数 两两互质 使和最大 求这个最大的和

思路:

显然,得到两个结论

1 最终的所有数都只能分解为两个质因数

2 这两个质因数 一个<根号n 一个>根号n

于是可以建立二分图,按照数值是否大于根号n分为两个集合

把每个点不大于n的最大次幂加入答案

对于每两个所属集合不同的点,判断他们两个对答案的贡献是否大于两个独立对答案的贡献

如果是,就连边 跑最大费用流

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define inf 2139062143
#define MAXN 200100
#define MAXM 1000100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,ntp[MAXN],p[MAXN],tot,ans,q1[MAXN],q2[MAXN],r1,r2;
struct ZKW
{
int fst[MAXN],to[MAXM<<],nxt[MAXM<<],val[MAXM<<],cos[MAXM<<],cnt;
int dis[MAXN],s,t,vis[MAXN],res;
ZKW() {res=,cnt=;}//memset(fst,0xff,sizeof(fst));}
void add(int u,int v,int w,int c) {nxt[cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w,cos[cnt++]=c;}
int spfa()
{
memset(dis,,sizeof(dis));
queue<int> q;
dis[t]=,vis[t]=;
q.push(t);
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=;
for(int i=fst[x];i;i=nxt[i])
if(val[i^]&&dis[to[i]]>dis[x]-cos[i])
{
//cout<<x<<" "<<dis[x]<<" "<<to[i]<<endl;
dis[to[i]]=dis[x]-cos[i];
if(!vis[to[i]]) {q.push(to[i]);vis[to[i]]=;}
}
}
//memset(vis,0,sizeof(vis));
//cout<<dis[s]<<endl<inf;
return dis[s]<;
}
int dfs(int x,int a)
{
if(x==t||!a) {res+=dis[s]*a;return a;}
if(vis[x])return ;
vis[x]=;
//cout<<x<<endl;
int res=,f;
for(int i=fst[x];i&&a;i=nxt[i])
if(val[i]&&dis[to[i]]==dis[x]-cos[i]&&(f=dfs(to[i],min(a,val[i]))))
res+=f,val[i]-=f,val[i^]+=f,a-=f;
vis[x]=;
return res;
}
void solve()
{
while(spfa())
{
vis[t] = ;
while(vis[t])
{
memset(vis,,sizeof(vis));
dfs(s,);
}
}
}
}Z;
void mem()
{
for(int i=;i<=n;i++)
{
if(!ntp[i]) p[++tot]=i;
for(int j=;p[j]*i<=n&&j<=tot;j++)
{
ntp[p[j]*i]=;
if(i%p[j]==) break;
}
}Z.s=,Z.t=tot+;
}
int calc(int n,int x) {int i=x;for(;i*x<=n;i*=x);return i;}
int main()
{
//freopen("kissatenn16.in","r",stdin);
n=read();mem();int h=sqrt(n),a,b,tmp,k;
for(int i=;i<=tot;i++)
{
//cout<<i<<" "<<p[i]<<" "<<ans<<endl;
if(p[i]*>n) {ans+=p[i];continue;}
if((ll)p[i]*p[i]<=n){Z.add(Z.s,i,,);Z.add(i,Z.s,,);ans+=calc(n,p[i]);q1[++r1]=i;}
else {Z.add(i,Z.t,,);Z.add(Z.t,i,,);ans+=p[i],q2[++r2]=i;}
}
for(int i=;i<=r1;i++)
for(int j=;j<=r2;j++)
{
a=p[q1[i]],b=p[q2[j]];
if(p[q1[i]]*p[q2[j]]<=n)
{
tmp=calc(n/b,a)*b,k=calc(n,a)+b;
//cout<<a<<" "<<b<<" "<<tmp<<" "<<k<<endl;
if(tmp>k) {Z.add(q1[i],q2[j],,k-tmp);Z.add(q2[j],q1[i],,tmp-k);}
}
else break;
}
//cout<<ans<<endl;
Z.solve();printf("%d",ans-Z.res+);
}

bzoj 3308 九月的咖啡店的更多相关文章

  1. bzoj 3308: 九月的咖啡店【最大费用最大流】

    费用流里spfa最后的判断要写成dis[t]>=0而不是dis[t]!=-inf否则会WAWAWA-- #include<iostream> #include<cstdio&g ...

  2. 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)

    3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 244  Solved: 86 Description 深绘里在九份开了一家咖 ...

  3. 【BZOJ-3308】九月的咖啡店 最大费用最大流 + 线性筛素数

    3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 56[Submit][Status][Discuss ...

  4. [bzoj3308]九月的咖啡店_欧拉筛素数_费用流

    bzoj-3308 九月的咖啡店 题目大意:深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不 ...

  5. BZOJ3308 九月的咖啡店

    Orz PoPoQQQ 话说这题还有要注意的地方... 就是...不能加SLF优化,千万不能加 n = 40000,不加本机跑出来2sec,加了跑出来40sec...[给跪了 /*********** ...

  6. BZOJ 3308 毒瘤结论 网络流

    结论:在答案集合中的数其质因数最多有两个 且有两个的话一个>n1/2一个<n1/2 这样我们就可以把所有质数筛出来 弄成二分图 左边是<n1/2右边是>n1/2的 所以先把单个 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. [Python3网络爬虫开发实战] 1.3.3-pyquery的安装

    pyquery同样是一个强大的网页解析工具,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便.本节中,我们就来了解一下它的安装方式. 1. 相关链接 GitHub:h ...

  2. 树莓派 - gpio-led platform driver 控制LED

    树莓派3b板上有两个LED, pwr (power) 和 act (activity).是platform_driver gpio-led驱动. 可以通过设备树和gpio-led来额外控制一个LED. ...

  3. jsp include html 乱码问题解决

    方法一: 在被包含的html中,在首行加上 <%@ page language="java" import="java.util.*" pageEncod ...

  4. Matlab学习笔记(一)

    一.MATLAB概述 (一)运行环境 命令行窗口(Command Window) 表 1-1 数据显示格式设置(e_one_1.m) 格式 实例 说明 format short 3.1416 小数点后 ...

  5. 【XML】-- C#读取XML中元素和属性的值

    Xml是扩展标记语言的简写,是一种开发的文本格式. 啰嗦几句儿:老师布置的一个小作业却让我的脑细胞死了一堆,难的不是代码,是n多嵌套的if.foreach,做完这个,我使劲儿想:我一女孩,没有更多女孩 ...

  6. 如何抓取崩溃的log日志

    4.手机录屏工具的推荐 Andriod:录屏大师,易录屏等等. iOS:AirPlayer,iTools. 5.如何抓取崩溃的log日志? android闪退获取日志方法: 1.下载adb工具包 2. ...

  7. 【BZOJ2142】礼物(扩展lucas定理,中国剩余定理合并方程)

    题意:有n件礼物,m个人,每个人分别需要w[i]件礼物,求分礼物的不同方案数 mod P 提示:设P=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi为质数. 1≤n≤10^ ...

  8. Codeforces700C. Break Up

    n<=1000,m<=30000的图,问割掉边权和尽量小的0.1或2条边使S和T不连通,输出割了哪些边,无解-1. 道理是很好懂的,先随便找S到T的一条路径,找不到输出0,找到的话这条路上 ...

  9. Linux下汇编语言学习笔记42 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. vagrant的学习 之 基础学习

    vagrant的学习 之 基础学习 本文根据慕课网的视频教程练习,感谢慕课网! 慕课的参考文档地址:https://github.com/apanly/mooc/tree/master/vagrant ...