Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long sum = 0;
for (int i = 1; i <= n; i++) {
sum += fun(i);
sum %= 1e9;
System.out.println(sum);
}
}
public static long fun(long n) {
if (n == 0 || n == 1) {
return 1;
} else {
return (long) (fun(n - 1) * n % 1e9);
}
}
}
>
> 🎃题解分析: 官方的骗术 当加到40多的阶乘时,**这个阶乘和后面的9位数就不会发生改变了。**
>
>
> 🗯️计算时模1e9(10的9次方)可以缩小倍数,算出结果。
>
>
>
## 🎈B: 幸运数字
>
> 本题总分:5分
>
>
> ### 🎯问题描述:
>
>
> 哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 126 126126 是十进制下的一个哈沙德数,因为 ( 126 ) 10 m o d ( 1 + 2 + 6 ) = 0 (126)*{10} mod (1+2+6) = 0(126) 10mod(1+2+6)=0;126 126126 也是八进制下的哈沙德数,因为 ( 126 ) 10 = ( 176 ) 8 , ( 126 ) 10 m o d ( 1 + 7 + 6 ) = 0 (126)*{10} = (176)*8,(126)*{10} mod (1 + 7 + 6) = 0(126) 10 =(176) 8 ,(126) 10 mod(1+7+6)=0; 同时 126 126126 也是 16 1616 进制下的哈沙德数,因为 ( 126 ) 10 = ( 7 e ) 16 , ( 126 ) 10 m o d ( 7 + e ) = 0 (126)*{10} = (7e)*{16},(126)\_{10} mod (7 + e) = 0(126) 10 =(7e) 16 ,(126) 10mod(7+e)=0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为 哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示 为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126... 1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . .1,2,4,6,8,40,48,72,120,126... 。现在他想知道第 2023 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
>
>
>
package pojo.LanQiao.day1;
//哈沙德数(126)10mod(1+2+6)=0;126 126126 也是八进制下的哈沙德数、
//第 2023 个幸运数 字是多少?
public class 幸运数字02 {
public static void main(String[] args) {
int n = 0;
for (int i = 1; i < 100000000; i++) {
if (fun(i)) {
n++;
if (n == 2023) {
System.out.println(i);
break;
}
}
}
}
public static boolean fun(int n) {
int sum = 0;
int x = n;
while (x != 0) {
sum += x % 10;
x /= 10;
}
if (n % sum != 0) {
return false;
}
sum = 0;
x = n;
while (x != 0) {
sum += x % 2;
x /= 2;
}
if (n % sum != 0) {
return false;
}
sum = 0;
x = n;
while (x != 0) {
sum += x % 8;
x /= 8;
}
if (n % sum != 0) {
return false;
}
sum = 0;
x = n;
while (x != 0) {
sum += x % 16;
x /= 16;
}
if (n % sum != 0) {
return false;
}
return true;
}
}
>
> 215040
>
>
> 🎃题解分析: 这题就是考察大家的进制转换,数据量也不大。直接看代码吧!
>
>
>
## 🎈**C:** 数组分割
>
> 本题总分: 10 分
>
>
> ### 🎯问题描述:
>
>
> 小蓝有一个长度为 N 的数组 A = [ A 0 , A 1 , . . . , A N − 1 ] 。现在小蓝想要从 A 对应的数组下标所构成的集合 I = { 0 , 1 , 2 , . . . , N − 1 } 中找出一个子集 R 1 ,那么 R 1在 I 中的补集为 R 2 。记 S 1 = ∑ r ∈ R 1 A r , S 2 = ∑ r ∈ R 2 A r,我们要求 S 1 和 S 2 均为 偶数,请问在这种情况下共有多少种不同的 R 1。当 R1 或 R 2 为空集时我们将 S 1 或 S 2 视为 0。
>
>
>
## 🎈D:矩形总面积
>
> 本题总分: 10 分
>
>
> ### 🎯问题描述:
>
>
> 平面上有个两个矩形R1和R2,它们各边都与坐标轴平行。设(x1 ,y1)和(x2, y2 )依次是R1的左下角和右上角坐标,(x3, y3)和(x4 ,y4)依次是R2的左下角和右上角坐标,请你计算R1和R2的总面积是多少?
> 注意:如果R1和R2有重叠区域,重叠区域的面积只计算一次。
>
>
>
package pojo.LanQiao.day1;
import java.util.Scanner;
public class 矩形总面积04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x1 = sc.nextInt();
int y1 = sc.nextInt();
int x2 = sc.nextInt();
int y2 = sc.nextInt();
int x3 = sc.nextInt();
int y3 = sc.nextInt();
int x4 = sc.nextInt();
int y4 = sc.nextInt();