题解:P2010 [NOIP2016 普及组] 回文日期

思路

考虑枚举和构造,然后判断是否可行,可行就方案数加一。

只需要算出后面四位就好了,然后再算前面用于判断是否超出边界。

然而你会考虑到闰年的特殊性。

但是我们发现,$2$ 月 $29$ 日反过来是 $9220$ 年,这是闰年。

代码

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int n, m, tmp, sum, ans, a[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 下标从 1 开始,因此 a[0] 存为 0,存为其他数字均可
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= 12; i++) // 枚举 12 个月
    {
        for (int j = 1; j <= a[i]; j++) // 枚举每个月的日期
        {
            tmp = (j % 10) * 1000 + (j / 10) * 100 + (i % 10) * 10 + (i / 10); // 算出月和日
            sum = tmp * 10000 + i * 100 + j; // 算出整个日期
            if (sum < n || sum > m) // 判断是否超出日期边界
                continue;
            ans++; // 答案加一个
        }
    }
    cout << ans << endl;
    return 0;
}