2017 ACM-ICPC西安现场赛 J题LOL(暴力)

题意:输入五个长度为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);
   }
}


猜你喜欢

转载自blog.csdn.net/zlatan10/article/details/79126297