BZOJ3308九月的咖啡店

2021-07-10 15:03:22 字數 1737 閱讀 6269

3308: 九月的咖啡店

time limit: 30 sec memory limit: 128 mb

submit: 140 solved: 49

description

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

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

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

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

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

最大可為多少。

input

乙個數字n

output

如題 sample input

10 sample output

30 hint

1<=n<=200000

直觀感受是,所有質因數分別單獨存在於乙個數中

但是還要考慮到,倆個質因數一起存在於乙個數中可以更優

如3,5,n=20

9+5<3*5

聽說,至多倆個質因數存在於乙個數中0.0

且乙個大於根號n,乙個小於根號n

於是就能費用流最大費用匹配了(不斷增廣至費用<0)

乙個優化是,先假設所有質因數單獨存在,把這部分收益加入答案

若a,b能配對

a,b連邊 權值vab−va−vbvab−va−vb

這樣費用流就跑的飛起了

wa了8次。。

附上本蒟蒻的**:

#include

#include

#include

#include

using namespace std;

#define inf 1000000000

#define maxn 200001

int ans,n,tot,t,cnt=1,dis[maxn],h[maxn],prime[maxn],q[maxn],head,tail;

bool mark[maxn],vis[maxn];

vectorq1,q2;

struct kx

edge[maxn*10];

intread()

while (ch>='0' && ch<='9')

w=w*10+ch-'0',ch=getchar();

return w*c;

}void add(int u,int v,int w,int cost)

;h[u]=cnt;

cnt++,edge[cnt]=(kx);h[v]=cnt;

}bool spfa()}}

return dis[0]>0;

}int dfs(int

x,int f)

return used;

}int v(int n,int

x)void build()

if ((long long)t*t

<=n)

else

}for (i=0;ifor (j=0;jif (a*b

<=n)

else

break;

}}int main()

}t=n+1;

build();

while (spfa())

printf("%d",ans+1);

return

0;}

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種原料來調同一杯咖啡,使用的原料編號之...

bzoj3308 九月的咖啡店 費用流

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