深繪里在九份開了一家咖啡讓,如何調配咖啡民了她每天的頭等大事
我們假設她有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種原料來調同一杯咖啡,使用的原料編號之...