题解:P8690 [蓝桥杯 2019 国 B] 填空问题
Que.A
从 $2019$ 暴力枚举即可。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
long long ans = 1073741824; // 2^30
int main()
{
for (long long x = 2020; x <= 10000; x++)
{
for (long long y = x + 1; y <= 10000; y++)
{
if (y * y - x * x == x * x - 2019 * 2019 && x + y < ans)
ans = y + x;
}
}
cout << ans << endl;
}
答案是 $7020$。
Que.B
先拆出质数,然后就是选或不选数。
选或不选?典型的 0/1 背包。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
bool vis[10005]; // 判断素数
long long n, c[10005]; // 存储素数
long long f[10005]; // 动规数组
void dfs() // 乱起的函数名
{
for (long long i = 2; i <= 2019; i++)
{
if (vis[i])
continue;
c[++n] = i;
for (long long j = 2; j * i <= 2019; j++)
vis[j * i] = 1;
}
}
int main()
{
dfs();
f[0] = 1;
for (long long i = 1; i <= n; i++)
{
for (long long j = 2019; j >= c[i]; j--)
f[j] += f[j - c[i]];
}
cout << f[2019] << endl;
}
答案是 $55965365465060$。
Que.C
每次都能旋转,那直接深搜旋转四个方向。
答案是 $2444$。
Que.D
题目太水了!直接暴力枚举!
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int cnt;
int main()
{
for (int i = 4; true; i++)
{
cnt = 0; // 记得清空
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
cnt++; // 统计
}
if (cnt == 100)
{
cout << i << endl; // 输出
return 0; // 找到就退出
}
}
}
答案是 $45360$。
Que.E
还是深搜,然后递归一次。
答案是 $206$。
代码
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
char c;
string ans[5] = {"7020", "55965365465060", "2444", "45360", "206"};
int main()
{
cin >> c;
cout << ans[c - 'A'] << endl;
return 0;
}