题解:P8691 [蓝桥杯 2019 国 C] 填空问题
Que.A
既然要求整数倍,那就这样枚举:
for(int i = 2019;true;i += 2019)
那怎么判断每一位均为奇数呢?先把它转为字符串,在逐个判断:
bool f = true;
string s = to_string(i);
for(int j = 0;j < s.size();j++){
if((s[j] - '0') % 2 == 0){
f = false;
break;
}
}
if(f){
cout << i << endl;
return 0;
}
else
continue;
答案是 $139311$。
Que.B
直接遍历每一个字符,往右、下、右下、右上、左下 $5$ 个方向数出每个方向能组成多少递增对,全部统计起来即可。
答案是 $52800$。
Que.C
这题不水了,但是不在话下。
循环进行拆分即可,代码如下:
int n = 2019, f[2020][50];
for (int i = 0; i * i <= n; i++)
f[0][i] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j * j <= i; j++)
{
for (int k = j + 1; k * k <= i; k++)
f[i][j] += f[i - k * k][k];
}
}
cout << f[n][0] << endl;
return 0;
答案是 $26287$。
Que.D
主人公怎么不是小蓝了,还看不习惯呢。
看了看觉得又是组合数学又是图论,结果两个都不是。
没有想象中的那么恐怖,因为除了文件前面,其实根本没有重边和环,而且答案其实最后再一起统计就好了(相当于马不停蹄的从北京一直绕其他 $19$ 个城市后再回到北京)。
答案是 $41613$。
Que.E
一眼动态规划,但又不是。
其实就是相对位置关系($5 \times 3 \times 2 = 30$)跟能改变的数量相乘($2 \times 2 \times 2 = 8$),也就是 $240$。
答案是 $240$。
代码
#include <bits/stdc++.h>
using namespace std;
char c;
int ans[5] = {139311, 52800, 26287, 41613, 240};
int main()
{
cin >> c;
cout << ans[c - 'A'] << endl;
return 0;
}
当然,这样是算不对的,第四题错了,正确输出是 $47373$。
所以正确代码是:
#include <bits/stdc++.h>
using namespace std;
char c;
int ans[5] = {139311, 52800, 26287, 47373, 240};
int main()
{
cin >> c;
cout << ans[c - 'A'] << endl;
return 0;
}
唯一的一篇题解也说了有错,具体是什么原因……
咱也不知道,咱也不敢问(