题解与反思
练习赛的题真的很难,对小白不是很友好!!! 最近做题有点静不下心来,没有思路之后老是想着去查资料,自己独立思考的时间很少。
B 选择游戏
-
一开始认为,质数减一之后一定不在是质数,那么我们只需要统计一下,原来的质数数量,并且让他变为奇数个即可,但是交了几发都WA了,开始思考特殊情况。
-
为什么想到质数减一就不是质数了呢,因为质数肯定不是偶数(!!!),减一之后肯定变为偶数,就一定不是质数了,但是有一个特例:3。3是质数减一之后还是质数。
-
那我们怎么解决这个3呢?刚开始,犯了一个糊涂的错误。单独考虑3,发现不管是偶数个3还是奇数个3,小灰灰先操作都会输掉。然后我就想,是不是要把3全部删掉,交了几发WA。
-
把其他数也考虑进来,发现不是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题就上难度了。 数学推导题
-
直接枚举肯定会超时的,我们就想能不能少枚举一下。
-
我们把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;
}