分析:一开始看到题目的我一脸蒙蔽。。看了一会儿才看懂。。
设f[i][j]表示i个字母取模7等于j的方案数,只要三个式子有一个等于0就加上答案。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
int n,m;
char a[2],s[10];
ll ans,f[20][20],c[10],b[10];
void dfs(int x,ll sum)
{
if (x>7)
{
int x1=(b[1]+b[2]*2+b[3]*2+b[4])%7;
int x2=(b[5]+b[6]+b[2]+b[3])%7;
int x3=(b[7]+2*b[6])%7;
if (!x1||!x2||!x3)ans+=sum;
return;
}
fo(i,0,6)
{
b[x]=i-7;
c[x]=f[x][i];
if (!c[x])continue;
dfs(x+1,sum*c[x]);
}
}
int main()
{
s[1]='B';s[2]='E';s[3]='S';s[4]='I';s[5]='G';s[6]='O';s[7]='M';
scanf("%d",&n);
fo(i,1,n)
{
scanf("%s%d",a,&m);
fo(j,1,7)
{
if (a[0]==s[j])
f[j][(m%7+7)%7]++;
}
}
dfs(1,1);
printf("%lld\n",ans);
return 0;
}