题目大意:

求若干个<=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. virtualbox虚拟机桥接方式网络设置

    一.编辑网卡 cd   /etc/sysconfig/network-scripts 查看本地win10ip及子网掩码: 如果查看到的ip不是192开头的,可以手动设置为192开头的ip 2.设置虚拟 ...

  2. leetcode-88合并两个有序数组

    合并两个有序数组 思路:利用索引合并两个列表,排序.注意不需要返回值,只修改nums1 class Solution: def merge(self, nums1: List[int], m: int ...

  3. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  4. STM32——GPIO口的八种工作模式

    GPIO的输入工作模式1——输入浮空模式: GPIO_Mode_IN_FLOATING =0x04 工作原理:配置完相应寄存器为此工作模式后,高低电平信号通过1处的IO口输入进去,由于寄存器配置了的缘 ...

  5. es6(var,let,const,set,map,Array.from())

    1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function ...

  6. expdp,impdp,include,exclude

    The examples below are based on:- the demo schema SCOTT that is created with script: $ORACLE_HOME/rd ...

  7. Spring Data JPA 中常用注解

    一.java对象与数据库字段转化 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 2.@Table:设置实体类在数据库所对应的表名 3.@Id:标识类里所在变量为主 ...

  8. Linux rz的使用

    RZ是Linux提供的上传的命令,基于XMODEM/YMODEM/ZMODEM协议. 让我们来测试一下参数吧: 先准备一个文件,就叫test.txt吧,内容如下: one line rz -+  如果 ...

  9. 【BZOJ2440】完全平方数(莫比乌斯函数,容斥原理)

    题意:求第k个无平方因子数 k<=10^9 思路: 感觉这东西和欧拉筛差不多……活到老学到老,退役前学点新知识也是好的 为什么二分答案的上界是2*n?连LYY都证不出来 话说约大爷一年之前就已经 ...

  10. P1165 日志分析 洛谷

    https://www.luogu.org/problem/show?pid=1165 题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...