题目地址: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(瞎搞),布布扣,bubuko.com
时间: 2024-10-10 13:45:03