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