第十届决赛 c++ B组 填空题
long g = 2019 * 2019;
for(long x = 2020; x <= 9999; x++){
for(long y = x + 1; y <= 9999; y++){
if(x*x - g == y * y - x * x){
System.out.println(x+" " +y);
return;
}
}
}
public class Main {
static int cnt;
static int[] pr = new int[2020];
static boolean[] st = new boolean[2020];
//埃氏筛(所有质数的倍数删掉)
public static void find(int n) {
for (int i = 2; i <= n; i++) {
if (!st[i]) {
pr[cnt++] = i;
for (int j = 2 * i; j <= n; j += i) {
st[j] = true;
}
}
}
}
public static void main(String[] args) {
int n = 2019;
find(n);
//DP数组 dp[i][j]dp[i][j]的含义为在前i个质数中,能组成j的最大方法数
long[][] dp = new long[cnt + 1][n + 1];
// 一个都不选 构成0 的方案数为1
dp[0][0] = 1;
for (int i = 1; i <= cnt; i++) {
for (int j = 0; j <= n; j++) {
//1.先假设选这个数之后不能组成j,则“继承”上一个的方法数 2.如果判断发现能组成,不选择这个数,则加上之前的方法数
dp[i][j] = dp[i - 1][j];
//如果判断发现能组成,选择这个数,则加上之前的方法数
if (j >= pr[i - 1]) {
dp[i][j] += dp[i - 1][j - pr[i - 1]];
}
}
}
System.out.println(dp[cnt][2019]);
}
}
第十届决赛 c++ C组 填空题
int n = 2019;
for(int i = 1;;i++){
int res = n * i;
int t = res;
boolean flag = true;
while(t > 0){
int g = t % 10;
if(g % 2 == 0){
flag = false;
break;
}
t /= 10;
}
if (flag){
System.out.println(res);
return;
}
}
import java.util.*;
public class Main {
// 使用一个全局变量记录能够分解的总的数目
static int res = 0;
// i表示当前递归的平方的计数, n表示当前的平方和, rec用来记录中间的结果
public static void dfs(int i, int n, List<Integer> rec){
// 可以不写i >= 45这个条件因为下面的for循环会有一个范围当大于了45了之后根本不会执行循环
if (n > 2019){
return;
}
if (n == 2019){
res++;
return;
}
for (int k = i; k < 45; ++k){
rec.add(k);
// 相当于也是选取与不选取当前的数字两种平行状态
dfs(k + 1, n + k * k, rec);
//回溯 末尾的数字弹出
rec.remove(rec.size() - 1);
}
}
public static void main(String[] args) {
dfs(0, 0, new ArrayList<Integer>());
System.out.println(res);
}
}
第十届蓝桥杯省赛填空题 https://www.acwing.com/blog/content/51700/