1. 程式人生 > >2017 ACM-ICPC西安現場賽 J題LOL(暴力)

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);
   }
}