POI2014 Solar Panels

Solar Panels

POI2014

题意

多组询问,每次问x∈[L1,R1],y∈[L2,R2]时,gcd(x, y)的最大值

1.设答案为d
那么必须满足 ⌊ L 1 − 1 d ⌋ \lfloor\frac{L1-1}{d}\rfloor dL11< ⌊ R 1 d ⌋ \lfloor\frac{R1}{d}\rfloor dR1&& ⌊ L 2 − 1 d ⌋ \lfloor\frac{L2-1}{d}\rfloor dL21< ⌊ R 2 d ⌋ \lfloor\frac{R2}{d}\rfloor dR2

2.问题就是找到最大的d满足上面的条件

3.观察式子 ⌊ L 1 − 1 d ⌋ \lfloor\frac{L1-1}{d}\rfloor dL11< ⌊ R 1 d ⌋ \lfloor\frac{R1}{d}\rfloor dR1&& ⌊ L 2 − 1 d ⌋ \lfloor\frac{L2-1}{d}\rfloor dL21< ⌊ R 2 d ⌋ \lfloor\frac{R2}{d}\rfloor dR2
这是向下取整,所以选d时,尽量选让R1,R2能整除的,使R1,R2的损失尽可能少

4.枚举一个d,从1开始
然后找到在这个d的情况下,如果整除,最大可以得到多大的d’
d’=min(R1/(R1/d),R2/(R2/d))
两个数应该优先满足小数整除,毕竟大数后面还会有机会

如果满足 ⌊ L 1 − 1 d ′ ⌋ \lfloor\frac{L1-1}{d'}\rfloor dL11< ⌊ R 1 d ′ ⌋ \lfloor\frac{R1}{d'}\rfloor dR1&& ⌊ L 2 − 1 d ′ ⌋ \lfloor\frac{L2-1}{d'}\rfloor dL21< ⌊ R 2 d ′ ⌋ \lfloor\frac{R2}{d'}\rfloor dR2,ans=max(ans,d’)

然后d=d’+1,直接跳到下一块去

5.每次找到一个d’,d’被R1整除或者d’被R2整除,总复杂度为O( R 1 + R 2 \sqrt{R1}+\sqrt{R2} R1 +R2 )

具体代码

#include
using namespace std;
int q,ans;
int L1,R1,L2,R2;
void rd(int &res){
	res=0;
	char c;
	while(c=getchar(),c<48);
	do res=(res<<3)+(res<<1)+(c^48);
	while(c=getchar(),c>47);
}
int main() {
    rd(q);
    while(q--) {
    	rd(L1),rd(R1),rd(L2),rd(R2);
        ans=0;
        L1--,L2--;
        if(R1>R2)swap(L1,L2),swap(R1,R2);
        for(int i=1,j; i<=R1; i=j+1) {
            j=min(R1/(R1/i),R2/(R2/i));
            if(R1/j>L1/j&&R2/j>L2/j)ans=j;
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(POI题解,POI)