目录
[A、阶乘求和 - BigInteger](#A、阶乘求和 - BigInteger)
[B、幸运数字 - 字符串 + 进制转换 暴力大法](#B、幸运数字 - 字符串 + 进制转换 暴力大法)
[C、数组分割 -](#C、数组分割 -)
A、阶乘求和 - BigInteger
思路:
当时比赛时,拿计算器算的,然后辛辛苦苦也没对
看到这个数肯定很大,而且只求后9位,阶乘越大,后面0个数会逐渐增长
首先设置BigInteger测试,发现从40!开始,再往后的数,后9位均为0,所以我们只用计算1!+......+39!然后取余就ok
答案是:420940313
java
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long res=0;
for(int i=1;i<=39;i++)
res=(res+f(i))%1000000000;
System.out.println(res);
}
public static long f(int x)
{
BigInteger res=new BigInteger("1");
for(int i=1;i<=x;i++) {
res=res.multiply(BigInteger.valueOf(i));
res=res.mod(BigInteger.valueOf(1000000000));
}
return res.longValue();
}
}
B、幸运数字 - 字符串 + 进制转换 暴力大法
思路:
可以偷懒用Java的进制转换api
注意对16进制转换时,a对应10,b对应11......
答案是:215040
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int cnt=0;
int i=1;
while(true)
{
if(ck(i,Integer.toBinaryString(i))&&ck(i,Integer.toOctalString(i))&&ck(i,Integer.toHexString(i))&&ck(i,String.valueOf(i)))
cnt++;
if(cnt==2023) {
System.out.println("!!"+i);
break;
}
i++;
}
}
public static boolean ck(int x,String s)
{
int sum=0;
for (char c:s.toCharArray())
if(c>='a'&&c<='f') sum+=c-87;
else sum+=c-'0';
if(x%sum==0) return true;
return false;
}
}
C、数组分割 -
思路: