UVALive - 7500

题意: 有N个球,就过有限次变换最后达到一种恒定状态
思路:题意不难懂,这种恒定状态也比较好像,他必须要达成1,2,3,4这种序列才能恒定,那么我们就要找到每个状态恒定时的球的数目。1,3,6,10就是等差数列的前n项和。公式s=a1*n+(n-1)*n*d/2。

然后我们就可以用二分去找答案,但是要注意范围,二分的r的范围是2*1e9,因为题目给得数据范围是10的18次方。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll unsigned long long
long long n;
long long erfen(long long l,long long r)
{
    long long nn;
    long long mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        nn=mid*(mid+1)/2;
        if(nn==n)
            return nn;
        else if(nn>n)
            r=mid-1;
        else
            l=mid+1;
    }
     nn=r*(r+1)/2;
     return nn;
}
int main()
{
    int t;
    int casee=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        printf("Case #%d: ",++casee);
        printf("%lld\n",erfen(1,2*1e9));
    }
}

猜你喜欢

转载自blog.csdn.net/zezzezzez/article/details/79835197