CF Gym 100500F Door Lock

根据题意略推一下,其实就是问你满足(a*(a+1))/2 < m <= ((a+1)*a(a+2))/2的a和m-(a*(a+1))/2 -1是多少。

二分求解就行了

#include<cstdio>



using namespace std;

typedef long long ll;



int main()

{

    int T;

    scanf("%d",&T);

    for(int k = 1; k <= T; k++){

        ll n,m;

        scanf("%I64d%I64d",&n,&m);

        ll L = 0, R = n;

        ll mid , b1, b2;

        while(L < R){

            mid = (L + R) >> 1;

            b1 = (mid*(mid+1))>>1;

            if(m <= b1) {

                R = mid;

                continue;

            }

            b2 = ((mid+2)*(mid+1))>>1;

            if(b2 < m) {

                L = mid;

                continue;

            }

            break;

        }

        if(L == R) mid = L;

        printf("Case %d: %I64d %I64d\n",k,mid,m-b1-1);

    }

    return 0;

}

 

你可能感兴趣的:(Lock)