码迷,mamicode.com
首页 > 其他好文 > 详细

整除分块

时间:2019-04-24 16:16:01      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:nbsp   取整   floor   pre   size   分块   最大的   scan   int   

$O(\sqrt{a_i})$求所有$f(\lfloor\frac{a_1}{d}\rfloor,\lfloor\frac{a_2}{d}\rfloor,...)$的值, 因为$j=\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor$是最大的$j$, 使得$\lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{j}\rfloor$

    scanf("%d", &n);
    REP(i,1,n) scanf("%d", a+i);
    int mx = *max_element(a+1,a+1+n);
    for (int i=1,j; i<=mx; i=j+1) {
        j = 1e9;
        REP(k,1,n) if (a[k]/i) j=min(j,a[k]/(a[k]/i));
        //现在 a[1]/i,a[1]/(i+1),...,a[1]/j相等
        //a[2]/i,a[2]/(i+1),...,a[2]/j相等
        //...
    }

上取整分块从大到小即可, 是因为$j=\lceil\frac{n}{\lceil\frac{n}{i}\rceil}\rceil$是最小的$j$, 使得$\lceil\frac{n}{i}\rceil=\lceil\frac{n}{j}\rceil$

    scanf("%d", &n);
    REP(i,1,n) scanf("%d", a+i);
    int mx = *max_element(a+1,a+1+n);
    for (int i=mx,j; i; i=j-1) {
        j = 0;
        REP(k,1,n) if (Div(a[k],i)) j=max(j,Div(a[k],Div(a[k],i)));
    }

 

整除分块

标签:nbsp   取整   floor   pre   size   分块   最大的   scan   int   

原文地址:https://www.cnblogs.com/uid001/p/10762810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!