【题意】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; }
所以,求什么设什么,还是有道理的O_O……