题解: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;
}