题单
1.两数之和[模拟]
2.相乘[模拟]
3.第几个幸运数字[模拟]
题解
1.两数之和
2.相乘
思路分析
填空题,按照题意模拟即可,需要注意的是数据范围很大,需要用 long 类型
参考代码
Java
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(in);
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int ans = 0;
static int N = 1000000007;
static {
for (int i = 1; i <= N; i++) {
if ((long)i * 2021 % N == 999999999) {
ans = i;
break;
}
}
}
public static void main(String[] args) throws Exception{
out.println(ans);
out.flush();
in.close();
}
}
时间复杂度分析
静态代码块在类加载的时候执行,而且只会执行一次,忽略不计的话,时间复杂度为 O(1),否则为 O(N)。
3.第几个幸运数字
思路分析
幸运数字是指只含有因子:3, 5, 7 的数字,所以这个数字一定是3^n * 5^n * 7^n
(n >= 0),比如:9 = 3 * 3 、15 = 3 * 5 、 75 = 3 * 5 * 7。
因为 59084709587505 < 3^30,所以每一个因子的循环次数最多不超过 30 次。
参考代码
Java
import java.util.Arrays;
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(in);
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static long num = 59084709587505L;
static int cnt = 0;
static {
for (int i = 0; i < 30; i++) {
for (int j = 0; j < 30; j++) {
for (int k = 0; k < 30; k++) {
if ((long)(Math.pow(3, i) * Math.pow(5, j) *Math.pow(7, k)) <= num) {
cnt++;
} else {
break;
}
}
}
}
}
public static void main(String[] args) throws Exception{
// out.println(Math.pow(3, 30) > num);
// 去除 3^0 * 5^0 * 7^0 这种情况
out.println(cnt - 1);
out.flush();
in.close();
}
}
时间复杂度分析
静态代码块在类加载的时候执行,而且只会执行一次,忽略不计的话,时间复杂度为 O(1),否则为 O(n^3),n 至多为 30。