题目大意:

求若干个<=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. Linux系统下设置vi编辑器,tab键为4

    1.cd ~ 2.vi .exrc 3.set tabstop=4(保存并退出)即可

  2. centOS7+mariadb+Nginx+PHP7.0 安装

    1.前期准备工作 更新 yum 源,自带的源没有 PHP5.6 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7 ...

  3. Python之爬虫-京东商品

    Python之爬虫-京东商品 #!/usr/bin/env python # coding: utf-8 from selenium import webdriver from selenium.we ...

  4. 新进Linux菜鸟,请多多关照

    早早知晓Linux的大名,一直未研究学习,近来看了kernel一些源代码,在网上搜过很多基础的知识.感觉这个Linux的世界很广大,值得好好深入学习.初生婴儿,呱呱落地,必先躺若干日后能坐,在学爬,进 ...

  5. 杭电 2035 (快速幂) 求A^B的最后三位数表示的整数

    Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方”    Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B&l ...

  6. Jmeter&Ant构建自动化测试平台

    JMeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术. Apache软件基金会的Stefano Mazzocchi JMeter的最初的开发.他写道:它主要对 Apache ...

  7. java 构造不可变类集的使用方法

    首先用到的就是Collections.unmodifiablexxx(         set.add("hello");         set.add("insert ...

  8. 2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念

    本来想昨天写的,但临时有事.弄的一晚上都没睡觉,现在头好晕,所以此笔记如果有语言措辞的组织不当,还请见谅:最后,本文可能涉及到大量专业名词,我会尽量用通俗的语句去阐述清楚它们的意思,但如果还是没看懂, ...

  9. [USACO5.3]巨大的牛棚Big Barn

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  10. 【HDOJ4812】D Tree(点分治)

    题意: 给定一棵 n 个点的树,每个点有权值 Vi 问是否存在一条路径使得路径上所有点的权值乘积 mod(10^6 + 3) 为 K 输出路径的首尾标号,若有多解,输出字典序最小的解 对于100%的数 ...