P1875 贝茜的报复
分析:
- 一开始想暴搜,7的20次方TLE
- 先算奇数的情况,三个数相乘为奇数,则这三个数分别都是奇数
- 第一部分B+I+2S+2E,所以必须保证B+I为奇数,决定字母就是B和I,第二部分保证 G+O+E+S为奇数,决定字母是G,O,E,S,第三部分保证M为奇数,决定字母为M
- 因为三部分的决定字母没有重复的,所以组成奇数的个数就是这三部分都为奇数的方案数相乘,遍历vector数组
- 组成偶数的方案数就是总方案数-奇数的方案数
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> vec[27];
char a;
int b;
int count1=0;
int count2=0;
int count3=0;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a>>b;
vec[a-'A'].push_back(b);
}
//先算奇数部分
//分成3部分
//第一部分B+I肯定是奇数
for(auto x:vec['B'-'A'])
{
for(auto y:vec['I'-'A'])
{
if((x+y)%2==1||(x+y)%2==-1)
{
count1++;
}
}
}
//第二部分GOES
for(auto x:vec['G'-'A'])
{
for(auto y:vec['O'-'A'])
{
for(auto k:vec['E'-'A'])
{
for(auto m:vec['S'-'A'])
{
if((x+y+k+m)%2==1||(x+y+k+m)%2==-1)
{
count2++;
}
}
}
}
}
for(auto x:vec['M'-'A'])
{
if(x%2==1||x%2==-1)
{
count3++;
}
}
int count4=1;
for(int i=0;i<=26;i++)
{
if(vec[i].size()>=1)
{
count4*=vec[i].size(); //vec[i].size()代表的是每个字母有几个
}
}
cout<<(count4-count1*count2*count3)<<endl;
}