第15届蓝桥杯模拟赛第三期Java

第一题

【问题描述】

  请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【Java程序代码】

​ 枚举

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int n;
	static int res;
	static public void main(String[] args) throws IOException{
		n=2023;
		for(int i=1;i*i<=n;i++) {
			if(i*i==n) res+=1;
			else if(n%i==0) {
				res+=2;
			}
		}
		out.print(res);
		out.flush();
	}
}

运行结果:6


第二题

【问题描述】

  请问有多少组整数对 l, r 满足:

  1. l 和 r 都介于 0 (含)到 100 (含)之间;
   2. r-l >= 10。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【Java程序代码】

​ 枚举

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int res=0;
	static public void main(String[] args) throws IOException{
		for(int l=0;l<=100;l++) {
			for(int r=0;r<=100;r++) {
				if(r-l>=10) {
					res++;
				}
			}
		}
		out.print(res);
		out.flush();
	}
}

运行结果:4186


第三题

【问题描述】

  只能被 1 和本身整除的数称为质数。
  请问在 1 (含)到 1000000 (含)中,有多少个质数的各个数位上的数字之和为 23 。
  提示:599 就是这样一个质数,各个数位上的数字之和为 5+9+9=23 。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【Java程序代码】

​ 枚举+线性筛

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int N=1000010;
	static boolean[] st=new boolean[N+1];
	static int[] prime=new int[N+1];
	static int cnt=0;
	static int res=0;
	static public void main(String[] args) throws IOException{
		zhi(N);
		for(int i=0;i<cnt;i++) {
			int x=prime[i];
			int sum=0;
			while(x!=0) {
				sum+=x%10;
				x/=10;
			}
			if(sum==23) {
				res++;
			}
		}
		out.print(res);
		out.flush();
	}
	static public void zhi(int x) {
		for(int i=2;i<=x;i++) {
			if(!st[i]) prime[cnt++]=i;
			for(int j=1;j*i<=x;j++) {
				st[j*i]=true;
			}
		}
	}
}

运行结果:5503


第四题

【问题描述】

  求 12345678901234567890123456789012345678901234567890 除以 2023 的余数。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【Java程序代码】

​ 快速幂

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
   static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
   static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
   static int y=0;;
   static int sum=0;
   static public void main(String[] args) throws IOException{
   		y=1234567890%2023;
   		sum=(reminder(0)+reminder(10)+reminder(20)+reminder(30)+reminder(40))%2023;
   		out.println(sum);
   		out.flush();
   }
   static public int reminder(int a) {
   	int p=2023;
   	int k=y%2023;
   	int res=k%p;
   	int t=10;
   	while(a!=0) {
   		int n=a&1;
   		if(n==1) res=res*t%p;
   		t=t*t%p;
   		a=a/2;
   	}
   	return res;
   }
}

运行结果:344


第五题

【问题描述】

  对于一个 n 行 m 列的矩阵,它的一个 k 行 k 列的子矩阵是指由矩阵中的连续 k 行、连续 k 列组成的矩阵。
子矩阵的和是指子矩阵中所有元素的和。现在,小蓝对于一个矩阵中的子矩阵中最大的子矩阵的和很感兴趣。
例如,对于如下 3 行 4 列的矩阵,2 行 2 列的子矩阵的和的最大值是 8,对应的子矩阵为由最后两行最后两列组成的子矩阵。
  2 0 2 3
  1 1 0 1
  1 2 3 4
  现在,小蓝有一个 30 行 20 列的大矩阵,如下所示,请问它的 5 行 5 列的子矩阵的和的最大值是多少?

​ 9719 7515 5916 6467 7157 9614 8560 9075 2099 2838 1403 7652 6238 1699 8907 1804 5384 7942 7546 1978
​ 8785 1944 8108 6040 2010 6646 2750 5410 4516 8757 5624 9257 9030 9290 6833 4646 9749 5304 5633 1573
​ 8525 8244 8514 7474 7896 9731 8402 9036 1869 2688 2085 1667 7753 8466 4911 3812 8585 8319 4020 7350
​ 1949 9120 4424 4057 8277 4511 6333 1533 7624 8932 1053 8682 9284 4134 1466 3607 8753 5310 3728 4163
​ 9420 9185 7055 2342 4143 4499 2036 5374 7026 8638 8866 8364 1706 8767 1601 8309 5695 8179 4142 8489
​ 5876 5660 4658 8307 2582 7544 8793 8207 3979 1692 1400 1893 4500 6389 7198 4836 4761 6603 2859 1312
​ 6367 4174 9956 6668 6771 4795 6492 3937 7096 8041 8644 9379 8071 8667 5810 5794 8147 3823 7877 4822
​ 4809 3297 8518 4972 9754 6854 3271 7891 8882 1052 3197 6035 5628 7674 7931 8085 8970 7733 4745 8785
​ 7536 1511 6964 4763 5409 7032 8963 8576 3411 5853 3316 1267 7851 2735 6953 2970 1810 6830 5576 6903
​ 2241 1575 2379 4679 9519 9290 4802 1562 3509 8365 6777 5143 5610 1061 7880 1935 5793 7023 5629 9571
​ 2480 5937 4612 8890 1964 8532 3309 9737 8507 1849 8544 1500 9282 6288 2137 4730 4239 3473 4643 6377
​ 7341 2881 3430 5815 1972 6629 3817 4547 7561 4779 6578 6114 4972 5505 7515 1800 4784 2272 4502 7541
​ 7665 8607 2022 8192 2605 1346 4155 8725 8167 7022 6136 3615 6057 6329 8671 2033 3151 2249 5981 6412
​ 9046 3353 8650 6965 4179 1248 5659 5219 8083 5615 3821 4436 9217 7356 3914 5717 3734 3765 4435 7210
​ 8951 5013 2951 7401 2329 5686 6530 9581 6539 6881 8634 2663 2916 3019 8529 5645 8201 9270 1939 7275
​ 6429 1531 6322 9586 2793 7968 4001 9665 7624 4369 6245 5146 9567 6801 6064 6199 3210 6753 2586 7795
​ 5771 8507 7973 1470 1475 6896 6781 6572 8412 8557 8255 5268 8960 7251 9214 2489 6920 9917 3810 4605
​ 9116 7950 3715 1697 4703 2868 8673 3106 2579 1074 3992 3547 4279 3149 3396 6081 6221 1125 9358 2471
​ 8360 1526 4116 9278 6325 5175 5533 4107 7522 7599 7711 9211 1752 2431 8321 3844 3579 1047 3987 8487
​ 7600 2401 8748 8945 2078 1519 4614 4576 5706 4040 9358 1928 1327 6699 5258 2846 3418 8310 1249 3866
​ 7796 8668 4087 4258 8992 8996 4617 5997 2527 8204 8927 1456 9340 2088 1605 2299 9878 8347 7789 2122
​ 8372 1102 4243 4208 1651 7861 4947 7802 4704 6204 4455 6012 8494 9060 3747 2786 2136 1830 7424 8309
​ 6919 4420 2031 5399 2652 7219 4048 7013 5094 5276 4225 5976 4157 6722 8765 4679 1604 4986 5033 2623
​ 4015 2297 3067 6261 6623 4577 4589 4747 6659 7667 7853 4040 6393 9606 7219 9334 1316 3430 9963 5187
​ 4998 3735 9884 2990 1374 8436 6674 3018 5714 9352 8708 8789 7879 2965 1444 4671 4743 9817 6066 8057
​ 6996 9609 2884 4601 7287 3432 4145 8858 6857 8624 4531 6579 1615 2894 4521 3274 5237 1093 3317 9289
​ 7117 1850 3210 8010 2512 1394 4718 9332 5593 4118 4995 3994 5063 9426 1709 5128 4997 9287 1907 9068
​ 4258 7328 6490 2603 5333 5093 8070 2116 8489 1994 7098 7409 1463 4268 9509 2358 1192 2460 5031 6292
​ 4911 1192 1012 2494 5276 8981 3540 3306 8869 6678 7879 7526 8847 6270 7653 3109 6955 9760 8520 8673
​ 6328 7277 7818 3285 9398 4929 4639 1617 4023 1051 9320 4955 6580 6481 3824 9611 2863 6492 6281 6203

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【Java程序代码】

​ 二维前缀和

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int n=30;
	static int m=20;
	static long[][] arr=new long[n+1][m+1];
	static public void main(String[] args) throws IOException{
		for(int i=1;i<=n;i++) {
			String[] lStrings=reader.readLine().trim().split(" ");
			for(int j=1;j<=m;j++) arr[i][j]=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1]+Integer.parseInt(lStrings[j-1]);
		}
		long maxv=0;
		for(int i=1;i<=n-5+1;i++) { 
			for(int j=1;j<=m-5+1;j++) {
				int x2=i+5-1;
				int y2=j+5-1;
				maxv=Math.max(maxv, arr[x2][y2]-arr[i-1][y2]-arr[x2][j-1]+arr[i-1][j-1]);
			}
		}
		out.print(maxv);
		out.flush();
	}
}

运行结果:171248


第六题

【问题描述】

  小蓝要上一个楼梯,楼梯共有 n 级台阶(即小蓝总共要走 n 级)。小蓝每一步可以走 1 级、2 级或 3 级台阶。
  请问小蓝至少要多少步才能上到楼梯顶端?

【输入格式】

  输入一行包含一个整数 n 。

【输入格式】

  输出一行包含一个整数,表示答案。

【输入格式】

  9
【输入格式】

  3
【评测用例规模与约定】

  对于所有评测用例,1 <= n <= 10000 。

【Java程序代码】

​ 贪心

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	
	static public void main(String[] args) throws IOException{
		int n=Integer.parseInt(reader.readLine().trim());
		if(n%3==0) out.print(n/3);
		else out.print(n/3+1);
		out.flush();
	}
}

第七题

【问题描述】

  给定一个仅包含数字字符的字符串,请统计一下这个字符串中出现了多少个值为奇数的数位。

【输入格式】

  输入一行包含一个字符串,仅由数字字符组成。

【输出格式】

  输出一行包含一个整数,表示答案。

【样例输入】

  123455
【样例输出】

  4
【样例输入】

  111222333111222333111222333
【样例输入】

  18
【评测用例规模与约定】

  对于所有评测用例,1 <= 字符数量 <= 10000 。

【Java程序代码】

​ 模拟

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main{
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static String string;
	static int res=0;
	static public void main(String[] args) throws IOException{
		string=reader.readLine().trim();
		for(int i=0;i<string.length();i++) {
			if((string.charAt(i)-'0')%2!=0) res++;
		}
		out.print(res);
		out.flush();
	}
}

第八题

【问题描述】

  对于一个序列 a[1], a[2], …, a[n],如果 a[i] 满足 a[i]<a[i-1] 且 a[i]<a[i+1],则称 a[i] 是一个极小值,如果如果 a[i] 满足 a[i]>a[i-1] 且 a[i]>a[i+1],则称 a[i] 是一个极大值。
  给定一个序列,请找到极小值中最大的和极大值中最小的。

【输入格式】

  输入的第一行包含一个整数 n ,表示序列的长度。
  第二行包含 n 个整数,相邻的整数之间使用一个空格分隔,表示给定的序列。

【输出格式】

  输出一行包含两个整数,用一个空格分隔,分别表示极小值中最大的和极大值中最小的。输入保证至少存在一个极小值,至少存在一个极大值。

【样例输入】

  8
  1 8 2 4 4 3 5 3
【样例输入】

  3 5
【评测用例规模与约定】

  对于所有评测用例,1 <= n <= 1000,0 <= a[i] <= 10000。

【Java程序代码】

​ 模拟

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int N=1010;
	static int n;
	static int[] a=new int[N];
	static public void main(String[] args) throws IOException{
		n=Integer.parseInt(reader.readLine().trim());
		String[] pStrings=reader.readLine().trim().split(" ");
		for(int i=0;i<n;i++) a[i]=Integer.parseInt(pStrings[i]);
		int maxv=10000;
		int minv=0;
		if(n==1) {
			out.print(a[0]+" "+a[0]);
			out.flush();
			return;
		}
		if(n==2) {
			Arrays.sort(a,0,n);
			out.print(a[0]+" "+a[1]);
			out.flush();
			return;
		}
		for(int i=1;i<n-1;i++) {
			if(a[i]<a[i-1]&&a[i]<a[i+1]) {
				minv=Math.max(minv, a[i]);
			}
			if(a[i]>a[i-1]&&a[i]>a[i+1]) maxv=Math.min(maxv, a[i]);
				
		}
		out.print(minv+" "+maxv);
		out.flush();
	}
}

第九题

【问题描述】

  对于一个字符矩阵,其中的一些字符构成字母 Y 是指存在一个中间字符,从这个中间字符向下、向左上(45度)、向右上(45度)的字符都与中间的字符相同。
  字母 Y 的长度指同时向 3 个方向的相同字母延伸的最大距离。
  例如,下图中所有的 1 组成一个字母 Y,长度为 3。
  又如,下图中以第 5 行第 6 列为中心也构成一个字母 Y (由字符 A 构成),长度为 1 。
  再如,下图中以第 4 行第 3 列为中心也构成一个字母 Y (由字符 0 构成),长度为 2 。

  1000001
  0100010
  0010100
  0001AAA
  00010A0
  00010A0
  00010A0

  给定一个字符矩阵,请找出能构成字母 Y 的最大长度,如果无法构成字母 Y,请输出 0 。

【输入格式】

  输入的第一行包含两个整数 n, m ,用一个空格分隔,表示字符矩阵的行数和列数。
  接下来 n 行,每行包含 m 个字符,表示字符矩阵。

【输出格式】

  输出一行包含一个整数,表示答案。

【样例输入】

  7 7
  1000001
  0100010
  0010100
  0001AAA
  00010A0
  00010A0
  00010A0
【样例输出】

  3
【评测用例规模与约定】

  对于50%的评测用例,1 <= n, m <= 100。
  对于所有评测用例,1 <= n, m <= 1000,字符矩阵中仅包含数字字符和大写英文字母。

【Java程序代码】

​ dfs

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int N=1010;
	static char[][] a=new char[N][N];
	static boolean[][] st=new boolean[N][N];
	static int maxv=0;
	static int n,m;
	static public void main(String[] args) throws IOException{
		String[] strings=reader.readLine().trim().split(" ");
		n=Integer.parseInt(strings[0]);
		m=Integer.parseInt(strings[1]);
		for(int i=0;i<n;i++) {
			String pString=reader.readLine().trim();
			for(int j=0;j<m;j++)
				a[i][j]=pString.charAt(j);
		}
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(!st[i][j])
					dfs(i,j,1);
			}
		}
		out.print(maxv-1);
		out.flush();
	}
	static public void dfs(int i,int j,int d) {
		if(i-d<0||j-d<0||j+d>=m||i+d>=n) {
			maxv=Math.max(maxv, d);
			return;
		}
		if(a[i-d][j-d]==a[i][j]&&a[i-d][j+d]==a[i][j]&&a[i+d][j]==a[i][j]) dfs(i, j, d+1);
		maxv=Math.max(maxv, d);
		return;
	}
}


第十题

【问题描述】

  小蓝要上一个楼梯,楼梯共有 n 级台阶(即小蓝总共要走 n 级)。小蓝每一步可以走 a 级、b 级或 c 级台阶。
  请问小蓝总共有多少种方案能正好走到楼梯顶端?

【输入格式】

  输入的第一行包含一个整数 n 。
  第二行包含三个整数 a, b, c 。

【输出格式】

  输出一行包含一个整数,表示答案。答案可能很大,请输出答案除以 1000000007 后的余数。

【样例输入】

  4
  1 2 3
【样例输出】

  7
【样例输入】

  7
  2 4 6
【样例输出】

  0
【评测用例规模与约定】

  对于 30% 评测用例,1 <= a < b < c <= n <= 50。
  对于 60% 评测用例,1 <= a < b < c <= n <= 1000。
  对于所有评测用例,1 <= a < b < c <= n <= 1000000。

【Java程序代码】

线性DP

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static int N=1000010;
	static long[] t=new long[N];
	static int n,a,b,c;
	static long mod=1000000007;
	static public void main(String[] args) throws IOException{
		n=Integer.parseInt(reader.readLine().trim());
		String[] pStrings=reader.readLine().trim().split(" ");
		a=Integer.parseInt(pStrings[0]);
		b=Integer.parseInt(pStrings[1]);
		c=Integer.parseInt(pStrings[2]);
		t[0]=1;
		for(int i=1;i<=n;i++) {
			if(i>=a) t[i]=t[i-a]%mod;
			if(i>=b) t[i]+=t[i-b]%mod;
			if(i>=c) t[i]+=t[i-c]%mod;
		}
		out.print(t[n]%mod);
		out.flush();
	}
}

  • 33
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值