给出一个数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;
}