2017 ACM-ICPC西安現場賽 J題LOL(暴力)
阿新 • • 發佈:2019-01-04
題意:輸入五個長度為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); } }