题解与反思

练习赛的题真的很难,对小白不是很友好!!! 最近做题有点静不下心来,没有思路之后老是想着去查资料,自己独立思考的时间很少。

B 选择游戏

  1. 一开始认为,质数减一之后一定不在是质数,那么我们只需要统计一下,原来的质数数量,并且让他变为奇数个即可,但是交了几发都WA了,开始思考特殊情况。

  2. 为什么想到质数减一就不是质数了呢,因为质数肯定不是偶数(!!!),减一之后肯定变为偶数,就一定不是质数了,但是有一个特例:3。3是质数减一之后还是质数。

  3. 那我们怎么解决这个3呢?刚开始,犯了一个糊涂的错误。单独考虑3,发现不管是偶数个3还是奇数个3,小灰灰先操作都会输掉。然后我就想,是不是要把3全部删掉,交了几发WA。

  4. 把其他数也考虑进来,发现不是3的个数问题,是谁先操作3的问题,谁先操作3必输。因为一个3可以操作两次,谁先手谁输。所以应该考虑,让不是3的质数的个数为奇数,然后让小蓝先操作3即可。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

bool isPrime(int x)
{
    if(x < 2) return 0;
    for(int i = 2; i <= sqrt(x); i ++)
    {
        if(x % i == 0) return 0;
    }
    return  1;
}
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        cin >> n;
        if(n == 0)
        {
            cout << -1 << endl;
            continue;
        }
        int k = 0;
        int kk = 0;
        for(int i = 0; i < n; i ++)
        {
            int x;
            cin >> x;
            if(isPrime(x) && x != 3) k ++;
            if(x == 3) kk ++;
        }
        if(k < 1) cout << -1 << endl;
        else
        {
            if(k % 2) cout << 0 << endl;
            else cout << 1 << endl;
        }
    }
    return 0;
}

C 找到数字

呜呜呜,C题就上难度了。 数学推导题

  1. 直接枚举肯定会超时的,我们就想能不能少枚举一下。

  2. 我们把x拆成三个部分ABC,A:第一位,C:最后一位,B: 中间的几位, y = AB + BC。 推导一下:

len : 表示x(ABC)的位数

AB = A * 10 ^ (len - 2) + B;

BC =  B * 10 + C;

===> y = A * 10 ^ (len - 2) + 11B + C;

===> 11B = y  - A * 10 ^ (len - 2) - C;

得出以下结论:
(1) 11B肯定为11的倍数
还有一个条件:
(2) B < 10 ^ (len - 2), 因为B的位数就是(len - 2)位
所以我们根据以上的条件和结论可以枚举A,C,10 ^ (len - 2) 来验证B是否符合条件
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

typedef long long LL;
int main()
{

    int t;
    cin >> t;
    while(t --)
    {
        LL y, cnt = 0;
        cin >> y;
        for(int a = 1; a <= 9; a ++)
        {
            for(int c = 0; c <= 9; c ++)
            {
                for(LL p = 1; p < 1e18; p *= 10)
                {
                    LL b = y - a * p - c;
                    LL bb = b / 11;
                    if(b >= 0 && (b % 11) == 0 && bb < p)
                    {
                        cnt ++;
                    }
                }
            }
        }
        cout << cnt << endl;
    }
    return 0;
}