题意:输入五个长度为100的01串,从每个串中选择一个是1的位置,任意两个串中选择的位置不能相同,一共有多少种情况,答案乘以常数531192758再对1e9+7取模。
如果对五个串都dfs复杂度是10^10稳T,所以对前四个串dfs,最后一个串的贡献直接加到最终的答案上。dfs的参数分别是第x个串和第五个串中是1的位置有sum个还没有被选择。
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
typedef pair<int,int>pp;
const int mod = 1e9+7;
char he[5][105];
int vis[105];
long long ans;
void solve(int x,int sum)
{
if(x == 4)
{
ans = (ans + sum)%mod;
return ;
}
for(int i = 0; i < 100; i++)
{
if(he[x][i] == '1' && !vis[i])
{
vis[i] = 1;
if(he[4][i] == '1') solve(x+1,sum -1);
else solve(x+1,sum);
vis[i] = 0;
}
}
}
int main()
{
while(scanf("%s",he[0]) != EOF)
{
for(int i = 1; i < 5; i++) scanf("%s",he[i]);
int su = 0;
for(int i = 0; i < 100; i++)
{
if(he[4][i] == '1') su ++;
}
ans = 0;
memset(vis,0,sizeof(vis));
solve(0,su);
ans = ans * 531192758%mod;
printf("%lld\n",ans);
}
}