A阶乘求和
从1!一直加到202320232023!,如果一个个算阶乘的后九位再相加,算法可以实现,但是运算量很大,需要一段时间。用计算器算了一下100!阶乘发现后几位都是0,因此加到202320232023!和加到100!后九位的结果是一样的。
public class A {public static void main(String[] args) {System.out.println(fd(100));//420940313}public static long fd(int num) {//求1!+……+num!和的后9位long sum=0;for(int i=1;i<=num;i++) {sum=(sum+fd1(i))%1000000000;}return sum;}public static long fd1(int num) {//求num的阶乘的末尾9位数,结果用sum表示long sum=1;for(int i=1;i<=num;i++) {sum=(sum*i)%1000000000;//每运算一次对10^9取模一次}return sum; }
}
B幸运数字
由题意得:一个数num在二、八、十、十六进制下数的每位相加,可以被num整除,就是幸运数。
public class B {public static void main(String[] args) {int sum=0;long i=0;while(sum<2023) {i++;if(two(i)&&ba(i)&&shi(i)&&shiliu(i))sum++;}System.out.println(i);}public static boolean two(long num) {//判断二进制下num是否为幸运数long num1=num;long sum=0;while(num1>0) {sum+=num1%2;num1/=2;}return num%sum==0?true:false;}public static boolean ba(long num) {//判断八进制下num是否为幸运数long num1=num;long sum=0;while(num1>0) {sum+=num1%8;num1/=8;}return num%sum==0?true:false;}public static boolean shi(long num) {//判断十进制下num是否为幸运数long num1=num;long sum=0;while(num1>0) {sum+=num1%10;num1/=10;}return num%sum==0?true:false;}public static boolean shiliu(long num) {//判断二进制下num是否为幸运数long num1=num;long sum=0;while(num1>0) {sum+=num1%16;num1/=16;}return num%sum==0?true:false;}
}
C数组分割
给定一个数组A,需要将A分成两个数组,使得这两个数组中元素的和相加都是偶数。
分析:1、如果N中有奇数个奇数,那么不管怎么分都会不会是两个子数组的和是偶数。
2、定义两个变量m,n,m代表技术的个数,n代表偶数的个数。
两个数组分别是S1,S2。此时若S1中元素的和为偶数,那么S2也必为偶数。
因此我们只需要讨论S1即可。
先将N分成两组,一组全为奇数,一组全为偶数。
题目即求如何取使得S1为偶数
直须满足,从奇数组中取偶数个奇数,从偶数组中任意取。
import java.util.Scanner;public class C {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int T=scanner.nextInt();int[] ans=new int[T];for(int j=0;j<T;j++) {int k=scanner.nextInt();int num;int m=0,n=0;for(int i=0;i<k;i++) {num=scanner.nextInt();if(num%2==0) {n++;}else {m++;}}if(m%2==1) {ans[j]=0;continue;}else {if(m==0) {ans[j]=(int) (Math.pow(2, n)%1000000007);}else {ans[j]=(int) (Math.pow(2, m-1)*Math.pow(2, n)%1000000007);}}} for(int i:ans) {System.out.println(i);}
}}
D矩形面积
两个矩形面积的和-重复区域的面积
import java.util.HashSet;
import java.util.Scanner;public class D {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int x1=scanner.nextInt();int y1=scanner.nextInt();int x2=scanner.nextInt();int y2=scanner.nextInt();int x3=scanner.nextInt();int y3=scanner.nextInt();int x4=scanner.nextInt();int y4=scanner.nextInt();long area=(long)(x2-x1)*(y2-y1)+(long)(x4-x3)*(y4-y3);int kuang=Math.max(0,Math.min(x4, x2)-Math.max(x1,x3));int gao=Math.max(0, Math.min(y4, y2)-Math.max(y3, y1));System.out.println(area-(long)kuang*gao);}}