HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937

多校的题以后得重视起来。。。每道题都错好多次。。。很考察细节。比如这道。。。。WA了无数次。。。。

这题的思路自己真心想不到。。。这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算。

当是1位的时候,显然只有3到6,此时只能是-1

当是2位的时候,可以转换成一元一次方程求解

当是3位的时候,可以转换成一元二次方程求解

当是4位的时候,此时最多也只有7000个数,7000^3接近1e12。所以剩下的直接枚举进制数来判断即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
int main()
{
    LL t, n, i, j, flag, a, b, c, ans, k, num=0;
    //freopen("1.txt","r",stdin);
    //freopen("2.txt","w",stdout);
    scanf("%I64d",&t);
    while(t--)
    {
        ans=0;
        num++;
        scanf("%I64d",&n);
        if(n>=3&&n<=6)
        {
            printf("Case #%I64d: -1\n",num);
            continue ;
        }
        for(i=3; i<=6; i++)
        {
            for(j=3; j<=6; j++)
            {
                k=(n-j)/i;
                if(k*i==n-j&&(n-j)/i>max(i,j))
                {
                    ans++;
                    //printf("--%d\n",k);
                }
            }
        }
        for(i=3; i<=6; i++)
        {
            for(j=3; j<=6; j++)
            {
                for(k=3; k<=6; k++)
                {
                    a=i;b=j;c=k-n;
                    LL f=b*b-4*a*c;
                    if(f>0)
                    {
                        LL d=sqrt(f);
                        if(d*d==f)
                        {
                            LL x=(-b+d)/(2*a);
                            if(x>max(max(i,j),k)&&x*2*a==(-b+d))
                            {
                                ans++;
                                //printf("---%d\n",x);
                            }
                        }
                    }
                }
            }
        }
        for(i=2; i<=7000; i++)
        {
            LL c=n, d, x=0;
            flag=0;
            while(c)
            {
                d=c%i;
                c=c/i;
                x++;
                if(d<3||d>6)
                {
                    flag=1;
                    break;
                }
            }
            if(!flag&&x>3)
            {
                ans++;
                //printf("----%d\n",i);
            }
        }
        printf("Case #%I64d: %I64d\n",num,ans);
    }
    return 0;
}


你可能感兴趣的:(编程,算法,C语言,ACM)