您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-14 23:44 316 查看
题目地址: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM c语言 算法 编程