bzoj 2257: [Jsoi2009]瓶子和燃料
2017-09-26 21:58
288 查看
题意:
在n个数中选k个数,使他们gcd最大。题解:
上面的模型转化用裴蜀定理。我是这么想的,将所有数的因数取出来,插到线段树上,然后找最大的且值大于k的点。
感觉时间空间都要炸。
然而开小空间后跑的飞快。
可能是平均每个数的因数不多吧。
code:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int inf=1000000000; struct trnode{ int lc,rc,c; }tr[10000000];int tot=0,root=0; int n,k; void update(int &x,int l,int 4000 r,int k) { if(!x) x=++tot; if(l==r){tr[x].c++;return;} int mid=(l+r)/2; if(k<=mid) update(tr[x].lc,l,mid,k); else update(tr[x].rc,mid+1,r,k); tr[x].c=max(tr[tr[x].lc].c,tr[tr[x].rc].c); } void pre(int a) { int len=sqrt(a); for(int i=1;i<=len;i++) if(a%i==0) { update(root,1,inf,i); if(i*i!=a) update(root,1,inf,a/i); } } int main() { scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) { int x;scanf("%d",&x); pre(x); } int l=1,r=inf,x=root; while(l<r) { int rcc=tr[tr[x].rc].c,mid=(l+r)/2; if(rcc>=k) x=tr[x].rc,l=mid+1; else x=tr[x].lc,r=mid; } printf("%d",l); }
相关文章推荐
- bzoj 2257: [Jsoi2009]瓶子和燃料【裴蜀定理+gcd】
- bzoj 2257: [Jsoi2009]瓶子和燃料
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
- 【bzoj2257】【jsoi2009】【瓶子和燃料】【裴蜀定理】
- bzoj 2257: [Jsoi2009]瓶子和燃料
- bzoj 2257: [Jsoi2009]瓶子和燃料
- BZOJ 2257 [Jsoi2009]瓶子和燃料
- 【bzoj2257】【JSOI2009】瓶子和燃料
- BZOJ 2257: [Jsoi2009]瓶子和燃料 数论
- bzoj 2257: [Jsoi2009]瓶子和燃料(裴蜀定理)
- BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】
- bzoj 2257: [Jsoi2009]瓶子和燃料
- [BZOJ2257][Jsoi2009]瓶子和燃料(数学)
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
- BZOJ 2257: [Jsoi2009]瓶子和燃料
- bzoj 2257[Jsoi2009]瓶子和燃料 数论/裴蜀定理
- 【BZOJ 2257】【JSOI 2009】瓶子和燃料 【裴蜀定理】
- BZOJ 2257 [Jsoi2009] 瓶子和燃料
- BZOJ 2257 JSOI 2009 瓶子和燃料 数学
- [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)