【Atcoder】AGC 020 B - Ice Rink Game 递推

【题意】n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1。n<=10^5。

【算法】递推||二分

【题解】令L(i),R(i)表示第i轮过后的最小人数和最大人数。

令X(i)和Y(i)表示区间[L(i),R(i)]中最小的a[i]倍数和最大的a[i]倍数。

L(i-1)=X(i),R(i-1)=Y(i)+a[i]-1。

X(i)=L(i)/a[i](上取整),Y(i)=R(i)/a[i](下取整)。

答案为L(0),R(0)。

#include<cstdio>
int n,a[100010];
long long L=2,R=2;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=n;i>=1;i--){
        L=((L-1)/a[i]+1)*a[i];
        R=R/a[i]*a[i]+a[i]-1;
    }
    if(L>R)printf("-1");else printf("%lld %lld",L,R);
    return 0;
}
View Code

 

所以,求什么设什么,还是有道理的O_O……

posted @ 2018-01-15 10:58  ONION_CYC  阅读(324)  评论(0编辑  收藏  举报