目录
A、阶乘求和 - BigInteger
B、幸运数字 - 字符串 + 进制转换 暴力大法
C、数组分割 -
A、阶乘求和 - BigInteger
思路:
当时比赛时,拿计算器算的,然后辛辛苦苦也没对看到这个数肯定很大,而且只求后9位,阶乘越大,后面0个数会逐渐增长
首先设置BigInteger测试,发现从40!开始,再往后的数,后9位均为0,所以我们只用计算1!+……+39!然后取余就ok
答案是:420940313
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
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、数组分割 -
思路: