public class _求阶乘和 {public static void main(String[] args) {// 根据已有的知识 可以知道的是,现在要求s的末尾九位数字,已知的是39之后的阶乘他的后九位都是0;//所以不需要计算到2023的阶乘//一个数求出来的阶乘想要末尾有0//数中必须要有2和5,已知的2的数目应该是远大于5的,所以需要找出5的数目// 5 10 15 20 25 30 35 40 注意到了25里面有两个无,刚好四十的阶乘,后九位都为0;long ans=0;for (int i = 1; i <=39; i++) {long sum=1;for (int j = 1; j <=i; j++) {sum=j*sum;sum= (long) (sum%1e9);}ans+=sum;}System.out.println(ans%1000000000);}
}
很巧妙的一道回溯算法的题目
class aMain {static int count = 0;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int T = scanner.nextInt();while (T-- > 0) {int N = scanner.nextInt();int[] A = new int[N];for (int i = 0; i < N; i++) {A[i] = scanner.nextInt();}count = 0;backtrack(A, 0, 0, 0);System.out.println(count % 1000000007);}}static void backtrack(int[] A, int index, int sum1, int sum2) {if (index == A.length) {if (sum1 % 2 == 0 && sum2 % 2 == 0) {count++;}return;}backtrack(A, index + 1, sum1 + A[index], sum2);backtrack(A, index + 1, sum1, sum2 + A[index]);}
}
只有两种选择,一个是加入到一集合中去,一个是加入到二集合中去,结束的条件是对应下标的索引值等于A.length的时候,同时满足sum1和sum2都是偶数的情况下 count++;
后序还可以考虑适当的剪枝进行优化,