本文主要是介绍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;
}
这篇关于HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!