题面:Luogu3123
额为什么这题一开始会没有想到这种很暴力的做法呢???
因为取模满足分配律,所以这题的暴力复杂度一下子就可以到可以接受的情况了
我们用a[i][j]表示字母为i(转化),这个数取模为j的个数
所以接下来就是直接
O(77)
暴力dfs就可以解决问题啦
统计答案就是乘法原理辣
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <ctime>
#include <map>
#include <queue>
#include <cstdlib>
#include <string>
#include <climits>
#include <set>
#include <vector>
#define int long long
using namespace std;
inline int read(){
int k=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
return k*f;
}
int o[128],a[8][7],ans=0,p[8];
inline void dfs(int x){
if(x==8){
int k=(p[1]+p[2]+p[3]+p[3]+p[4]+p[2])*(p[5]+p[6]+p[2]+p[3])*(p[7]+p[6]+p[6])%7;
if(!k){
int sum=1;
for(int i=1;i<=7;i++)sum*=a[i][p[i]];
ans+=sum;
}return;
}
for(int i=0;i<7;i++)if(a[x][i])p[x]=i,dfs(x+1);
}
signed main()
{
int n=read();
o['B']=1;o['E']=2;o['S']=3;o['I']=4;o['G']=5;o['O']=6;o['M']=7;
for(int i=1;i<=n;i++){
char c[5];scanf("%s",c);int x=(read()%7+7)%7;
a[o[c[0]]][x]++;
}
dfs(1);
printf("%lld",ans);
return 0;
}