hdu 4937 Lucky Number(数学:解方程)

给出一个数n,问你可以找到多少个进制使得n对应这个进制数中只含有3 4 5 6

分4种情况:

1、有无数个进制满足,对应3 4 5 6四个数字无论表示成什么进制的数都是本身,按照题目要求输出-1

2、n = i*x+j 枚举i, j求出对应x并判断是否满足x > max(i, j)

3、n = i*i*x+j*x+k 枚举 i, j, k求出对应x并判断是否满足x > max(i, max(j, k))

4、n = 表示为x的>=3次方方程形式,因为x^3 <= n 此时枚举x即可

这道题因为我傻逼了TLE了好多次。。。

最后一道循环里i的类型设置为int,和long long类型比较,爆int后变为负数陷入死循环。。。

代码如下:

//#include <bits/stdc++.h>
#include <cmath>
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;

int main(void) {
    int T;
    LL n, ans, tmp, x;
    scanf("%d", &T);
    for(int t=1; t<=T; ++t) {
        cin >> n;
        if(n>=3 && n<=6) {
            printf("Case #%d: -1\n", t);
            continue;
        }

        ans = 0ll;

        for(int i=3; i<7; ++i) {
            for(int j=3; j<7; ++j) {
                if((n-j)%i == 0) {
                    x = (n-j)/i;
                    if(x > max(i, j)) {
                        ++ans;
                        //printf("%d = %d*%d+%d\n", n, i, x, j);
                    }
                }
            }
        }

        //cout << "ans = " << ans << endl;

        for(int i=3; i<7; ++i) { 
            for(int j=3; j<7; ++j) {
                for(int k=3; k<7; ++k) {
                    tmp = j*j-4*i*(k-n);
                    if(tmp >= 0) {
                        LL res = (LL)sqrt(tmp*1.0+0.5);
                        if(res*res == tmp) {
                            tmp = -j+res;
                            if(tmp % (2*i) == 0) {
                                x = tmp/(2*i);
                                if(x > max(i, max(j, k))) {
                                    ++ans;
                                    //printf("%d = %d*%d*%d+%d*%d+%d\n", n, i, x, x, j, x, k);
                                }
                            }
                        }
                    }
                }
            }
        }

        //cout << "ans = " << ans << endl;
        
        #define FUCK_LL long long  

        for(FUCK_LL i=4; i*i*i<=n; ++i) {
            tmp = n;
            while(tmp) {
                if(tmp%i<3 || tmp%i>6)
                    break;
                tmp /= i;
            }
            if(tmp == 0)
                ++ans;
        }
        printf("Case #%d: %I64d\n", t, ans);

    }
    return 0;
}

写了一个DFS判断>=3次方程的解是否满足条件

因为写的比较挫,后来又写了一个数据生成器,两份代码跑相同数据找不同才改正

代码如下:

//#include <bits/stdc++.h>
#include <cmath>
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;

LL ans;

void dfs(LL n, int x) {

    if(n < x) {
        if(n>2ll && n<7ll) 
            ++ans;
        return ;
    }

    for(int i=3; i<7; ++i) {
        if(i<x && (n-i) % x == 0) {//需要保证i<x
            dfs((n-i)/x, x);
        }
    }
    return ;
}

int main(void) {
/*
    ifstream in("in.txt");
    ofstream out("out2.txt");
    cin.rdbuf(in.rdbuf());
    cout.rdbuf(out.rdbuf());
*/
    int T;
    LL n, tmp, x;
    cin >> T;
    for(int t=1; t<=T; ++t) {
        cin >> n;
        if(n>2 && n<7) {
            printf("Case #%d: -1\n", t);
            continue;
        }

        ans = 0ll;

        for(int i=3; i<7; ++i) {
            for(int j=3; j<7; ++j) {
                if((n-j)%i == 0) {
                    x = (n-j)/i;
                    if(x > max(i, j)) {
                        ++ans;
                        //printf("%d = %d*%d+%d\n", n, i, x, j);
                    }
                }
            }
        }

        //cout << "ans = " << ans << endl;

        for(int i=3; i<7; ++i) { 
            for(int j=3; j<7; ++j) {
                for(int k=3; k<7; ++k) {
                    tmp = j*j-4*i*(k-n);
                    if(tmp >= 0) {
                        LL res = (LL)sqrt(tmp*1.0+0.5);
                        if(res*res == tmp) {

                            tmp = -j+res;
                            if(tmp % (2*i) == 0) {
                                x = tmp/(2*i);
                                if(x > max(i, max(j, k))) {
                                    ++ans;
                                    //printf("%d = %d*%d*%d+%d*%d+%d\n", n, i, x, x, j, x, k);
                                }
                            }
                        }
                    }
                }
            }
        }

        //cout << "ans = " << ans << endl;

        for(LL i=4; i*i*i<=n; ++i) {
            dfs(n, i);
        }
        printf("Case #%d: %I64d\n", t, ans);

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值