若是结果为偶数,只需要一个括号结果为偶数即可
而若想一个括号内为偶数,只需使得一个括号内奇数的个数等于偶数即可
但是这样我们需要枚举哪个括号为奇数,有点麻烦
我们学过正难则反,所以我们枚举所有括号均为奇数时的可能
若所有括号均为奇数,则括号内需要有奇数个数目的奇数
并且一个数不会重复出现两次所以无需特判
有一个小技巧,那些在第一个括号里无所谓的数我们可以当做没有存在,也就是不去考虑它
#include<iostream>
using namespace std;
int a[8][2];
long long n,res=1,sum=1;
int main()
{
cin>>n;
while(n--)
{
char x;
int y;
cin>>x>>y;
if(x=='B')a[1][(y%2+2)%2]++;
else if(x=='E')a[2][(y%2+2)%2]++;
else if(x=='S')a[3][(y%2+2)%2]++;
else if(x=='I')a[4][(y%2+2)%2]++;
else if(x=='G')a[5][(y%2+2)%2]++;
else if(x=='O')a[6][(y%2+2)%2]++;
else if(x=='M')a[7][(y%2+2)%2]++;
}
for(int i=1;i<=7;i++)
{
res*=(a[i][0]+a[i][1]);
}
//第一个括号,可知只与B,I有关
sum=a[1][0]*a[4][1]+a[1][1]*a[4][0];
//第二个括号
int xx=0;
xx+=(a[2][1]*a[3][0]*a[5][0]*a[6][0]);
xx+=(a[2][0]*a[3][1]*a[5][0]*a[6][0]);
xx+=(a[2][0]*a[3][0]*a[5][1]*a[6][0]);
xx+=(a[2][0]*a[3][0]*a[5][0]*a[6][1]);
xx+=(a[2][0]*a[3][1]*a[5][1]*a[6][1]);
xx+=(a[2][1]*a[3][0]*a[5][1]*a[6][1]);
xx+=(a[2][1]*a[3][1]*a[5][0]*a[6][1]);
xx+=(a[2][1]*a[3][1]*a[5][1]*a[6][0]);
sum*=xx;
//第三个括号,可知只与M有关
sum*=a[7][1];
cout<<res-sum;
}
请问 (y%2+2)%2这一步是什么意思呢
负数要变成正数的
明白了,感谢
y%2怎么是负数的呢
本身可能是负数