hdu 4937 Lucky Number

来源:互联网 发布:屏蔽移动网络信号 编辑:程序博客网 时间:2024/05/07 15:42

hdu 4937 Lucky Number

给出一个十进制的数  你可以把他换成其他进制的表达形式  更换进制之后 每一位上只能由3 4 5 6组成 

如果能有这样的一个进制转换  答案就加1  

但是如果这样一个数能换成无数个其他进制的符合要求就输出-1  这样的数就只有 3 4 5 6

如果只有两位数的情况   表示为ab  则就变成解一元二次方程  a*base+b=n  解得的base 要比a b 都要大才行

如果只有三位数的情况  表示为abc  则就变成解一元二次方程 a*base*base+b*base+c=n  base要比abc都大

如果位数>=4   解方程的方法不太现实  就采取暴力枚举的方法了   

因为至少要满足3在数中  所以进制至少为4  因为至少有a*base*base*base  所以枚举直到i*i*i<=n即可

因为前面的变量都是__I64型的  在使用sqrt函数时  因为sqrt函数是对浮点数 所以要有个转换

代码如下:

#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <string.h>#include <string>#define eps 1e-8#define op operator#define MOD  10009#define MAXN  100100#define FOR(i,a,b)  for(int i=a;i<=b;i++)#define FOV(i,a,b)  for(int i=a;i>=b;i--)#define REP(i,a,b)  for(int i=a;i<b;i++)#define REV(i,a,b)  for(int i=a-1;i>=b;i--)#define MEM(a,x)    memset(a,x,sizeof a)#define ll __int64using namespace std;ll MAX(ll x,ll y,ll z){    return max(x,max(y,z));}int main(){freopen("ceshi.txt","r",stdin);    int tc;    scanf("%d",&tc);    int cs=1;    while(tc--)    {        printf("Case #%d: ",cs++);        ll n;        scanf("%I64d",&n);        if(n>=3&&n<=6)        {            printf("-1\n");            continue;        }        ll ans=0;        ll base;        for(ll i=3;i<=6;i++)        {            for(ll j=3;j<=6;j++)            {                if(((n-j)%i)!=0)  continue;                base=(ll)(n-j)/(ll)i;                if(base>max(i,j))                    ans++;            }        }        for(ll i=3;i<=6;i++)            for(ll j=3;j<=6;j++)                for(ll k=3;k<=6;k++)                {                    ll a=i; ll b=j; ll c=k-n;                    ll m=b*b-4*a*c;                    if(m<0)  continue;                    ll delta=(ll)sqrt(b*b-4*a*c+0.5);//+0.0即可                    if(delta*delta!=(b*b-4*a*c))  continue;                    if((delta-b)%(2*a))  continue;                    ll x=(delta-b)/(2*a);                    if(x>MAX(i,j,k))  ans++;                }        for(ll i=4;i*i*i<=n;i++)        {            ll x=n;            while(x)            {                if(x%i<3||x%i>6)   break;                x/=i;            }            if(!x)   ans++;        }        printf("%I64d\n",ans);    }    return 0;}


0 0