码迷,mamicode.com
首页 > Windows程序 > 详细

sgu-255 Winsock 3 Beta

时间:2015-05-25 22:33:58      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:

给定一个函数f(x)=g(x+1)+g(x+2)+.....+g(x?2),其中g(x)=[x31]。给你N(N<=100)个输入,每个输入给你一个m(m<=231?1),要你求出f(x)=m,存在输出YES,否则输出NO

解题思路:

首先我们考虑函数f(x)的单调性,f(x+1)?f(x)=g(x?2+2)+g(x?2+1)?g(x+1),从g(x)的定以来看,那么有:g(x)=g(x?2)。所以f(x+1)?f(x)=g(x?2+1),所以我们可以发现f(x)是单调不降的。那么如果f(x0)=m是有唯一解得话,那么就要满足f(x0+1)?f(x0)=1,f(x0)?f(x0?1)=1?g(x0?2+1)=g(x0?2?1)=1。然后我们观察发现,满足g(x0?2?1)=1必须有x0二进制下最后一定是.....10,发现这同时也满足g(x0?2+1)=1
所以x0=2t+2+2(t>=0),然后我们分类讨论一下发现f(2t+2+2)=(t+22)+1,所以我们要做的就是对于f(2t+2+2)=(t+22)+1=m
这很好做,再次不再赘述。

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#define sqr(a) ((a)*(a))

using namespace std;

const double eps=1e-8;

int n;

int main()
{
    scanf("%d",&n);
    for(;n>0;n--)
    {
        long long m;
        scanf("%lld",&m);
        if(m<=1)
        {
            puts("NO");
            continue;
        }
        long long a=1,b=3,c=-2*m+4;
        long long delta=sqr(b)-4*a*c;
        long long haha=(long long)(sqrt(delta)+eps);
        if(sqr(haha)==delta)
            puts("YES");
        else puts("NO");
    }
    return 0;
}

sgu-255 Winsock 3 Beta

标签:

原文地址:http://blog.csdn.net/qq_21995319/article/details/45973197

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!