bzoj3308 九月的咖啡店 費用流

2021-08-20 05:57:59 字數 1560 閱讀 4593

深繪里在九份開了一家咖啡讓,如何調配咖啡民了她每天的頭等大事

我們假設她有n種原料,第i種原料編號為i,調配一杯咖啡則需要在這

裡若干種兌在一起。不過有些原料不能同時在一杯中,如果兩個編號

為i,j的原料,當且僅當i與j互質時,才能兌在同一杯中。

現在想知道,如果用這n種原料來調同一杯咖啡,使用的原料編號之和

最大可為多少。

1<=n<=200000

首先這道題有兩個結論

結論一:所有被選的數字最多只有兩個質因數

結論二:所有有兩個質因數的被選數字乙個質因數大於√n另乙個質因數小於√n

知道了就很好做了。根據與√n的大小關係黑白染色然後連邊跑最大費用最大流即可

乙個跑得比較快的方法是先把所有單獨質數的答案加上,對於一條連線(p[i],p[j])的邊考慮它代表的含義,連容量為1費用為v[a*b]-v[a]-v[b],這裡v(a)表示質數a的貢獻

#include 

#include

#include

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define drp(i,st,ed) for (int i=st;i>=ed;--i)

#define fill(x,t) memset(x,t,sizeof(x))

typedef

long

long ll;

const

int inf=1000000007;

const

int n=400005;

const

int e=400005;

struct edge e[e];

int prime[n],n;

int dis[n],pre[n];

int ls[n],edcnt=1;

bool not_prime[n],vis[n];

std:: queue

que;

void add_edge(int x,int y,int w,int c) ; ls[x]=edcnt;

e[++edcnt]=(edge) ; ls[y]=edcnt;

}void pre_work(int n)

}}bool spfa(int st,int ed) }}

vis[now]=0;

}return dis[ed]!=inf;

}ll modify(int ed)

return (ll)dis[ed]*(dis[ed]>0);

}ll mcf(int st,int ed)

ll get(int x,int y)

int main(void)

rep(i,1,prime[0]) }}

}// printf("%lld\n", ans);

ans+=mcf(0,prime[0]+1);

printf("%lld\n", ans+1);

return

0;}

BZOJ3308九月的咖啡店

3308 九月的咖啡店 time limit 30 sec memory limit 128 mb submit 140 solved 49 description 深繪里在九份開了一家咖啡讓,如何調配咖啡民了她每天的頭等大事 我們假設她有n種原料,第i種原料編號為i,調配一杯咖啡則需要在這 裡若干...

bzoj3308 九月的咖啡店 費用流

這種題還是要先找問題的某些性質才能做 結論 1 乙個數中最多有兩個質數 2 兩個質數乙個小於根n,乙個大於根n 建二分圖 源點s向小於根n的質數連一條容量為1費用為0的邊 大於根n的質數向匯點t連一條容量為1費用為0的邊 小於根n的質數a向大於根n的質數b連一條容量為1費用為vab va vb的邊 ...

bzoj 3308 九月的咖啡店 費用流

深繪里在九份開了一家咖啡讓,如何調配咖啡民了她每天的頭等大事我們假設她有n種原料,第i種原料編號為i,調配一杯咖啡則需要在這裡若干種兌在一起。不過有些原料不能同時在一杯中,如果兩個編號為i,j的原料,當且僅當i與j互質時,才能兌在同一杯中。現在想知道,如果用這n種原料來調同一杯咖啡,使用的原料編號之...