Advertisement
Guest User

Untitled

a guest
May 5th, 2017
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. //in the name of allah
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<deque>
  6. #include<set>
  7. #include<map>
  8. #include<bitset>
  9. #include<cstdio>
  10. #include<cstdlib>
  11. #include<cassert>
  12. #include<string>
  13. #include<cstring>
  14. #include<vector>
  15. using namespace std;
  16. typedef pair<int , int> ii;
  17. typedef long long ll;
  18.  
  19. const int maxn = 3e5+10 , maxm = 2e6+10 , mod = 1e9+7;
  20. vector<int> g[maxn] , r[maxn] , cmp[maxn] , tp;
  21. vector<ii> e;
  22. int n , m , A , B , st[maxn] , len[maxn] , siz[maxn] , d[maxn] , mx[maxn] , mn[maxn] , fact[maxn] , inv[maxn] , sz;
  23. string a[maxn] , b[maxn];
  24. bool vis[maxn];
  25.  
  26. inline int mul(int a , ll b){
  27.     return (a * b) % mod;
  28. }
  29. inline int add(int a , ll b){
  30.     return (a + b + 2LL*mod) % mod;
  31. }
  32. inline int bp(int a , int b){
  33.     if(b == 0)
  34.         return 1;
  35.     int x = bp(a , b/2);
  36.     x = mul(x , x);
  37.     return b&1 ? mul(x,a) : x;
  38. }
  39. inline int C(int m , int n){
  40.     return n>=m ? mul(fact[n] , mul(inv[m] , inv[n-m])) : 0;
  41. }
  42. void dfs(int v){
  43.     vis[v] = true;
  44.     for(auto u : g[v])
  45.         if(!vis[u])
  46.             dfs(u);
  47.     tp.push_back(v);
  48. }
  49. void sfd(int v){
  50.     vis[v] = true;
  51.     st[v] = sz;
  52.     cmp[sz].push_back(v);
  53.     len[sz] = len[sz] == 0 ? siz[v] : __gcd(len[sz] , siz[v]);
  54.     for(auto u : r[v])
  55.         if(!vis[u])
  56.             sfd(u);
  57. }
  58.  
  59. int main(){
  60.     scanf("%d%d%d" , &n , &A , &B);
  61.     char STR[maxn];
  62.     for(int i=0 ; i<n ; i++){
  63.         scanf("%s" , STR);
  64.         for(int j=0 ; j<n ; j++){
  65.             if(STR[j] == '1'){
  66.                 g[i].push_back(j);
  67.                 r[j].push_back(i);
  68.                 e.push_back(ii(i , j));
  69.             }
  70.         }
  71.     }
  72.     char str[maxm];
  73.     for(int i=0 ; i<n ; i++){
  74.         scanf("%d%s" , &siz[i] , str);
  75.         mn[i] = 0;
  76.         for(int j=0 ; j<siz[i] ; j++){
  77.             a[i].push_back(str[j]);
  78.             mn[i] += (str[j] == '1');
  79.         }
  80.     }
  81.     if(A<B){
  82.         puts("0");
  83.         return 0;
  84.     }
  85.     for(int i=0 ; i<n ; i++)
  86.         if(!vis[i])
  87.             dfs(i);
  88.     memset(vis , 0 , sizeof vis);
  89.     while((int)tp.size()){
  90.         int i = tp.back();
  91.         tp.pop_back();
  92.         if(!vis[i]){
  93.             sfd(i);
  94.             sz ++;
  95.         }
  96.     }
  97.     for(int i=0 ; i<sz ; i++){
  98.         for(int j=0 ; j<len[i] ; j++)
  99.             b[i] += "0";
  100.         for(auto j : cmp[i])
  101.             for(int k=0 ; k<(int)a[j].size() ; k++)
  102.                 b[i][k%len[i]] = char(a[j][k] | b[i][k%len[i]]);
  103.     }
  104.     for(int i=0 ; i<n ; i++)
  105.         g[i].clear();
  106.     for(auto i : e)
  107.         if(st[i.first] != st[i.second])
  108.             g[st[i.first]].push_back(st[i.second]) , d[st[i.second]] ++;       
  109.     int cur = -1;
  110.     for(int i=0 ; i<sz ; i++)
  111.         if(d[i] == 0)
  112.             cur = i;
  113.     while(cur != -1){
  114.         int v = cur;
  115.         cur = -1;
  116.         int ptr=0;
  117.         for(auto u : g[v]){
  118.             d[u] --;
  119.             if(d[u] == 0)
  120.                 cur = u;
  121.         }
  122.         if(cur == -1)
  123.             break;
  124.         int u = cur;
  125.         int g = __gcd(len[v] , len[u]);
  126.         string str;
  127.         for(int i=0 ; i<g ; i++)
  128.             str += "0";
  129.         for(int i=0 ; i<b[v].size() ; i++)
  130.             str[i%g] = char(b[v][i] | str[i%g]);
  131.         for(int i=0 ; i<b[u].size() ; i++)
  132.             b[u][i] = char(b[u][i] | str[i%g]);
  133.     }
  134.     for(int i=0 ; i<sz ; i++){
  135.         int score=0;
  136.         for(int j=0 ; j<b[i].size() ; j++)
  137.             score += (b[i][j] == '1');
  138.         for(auto j : cmp[i])
  139.             mx[j] = score*(siz[j]/len[i]);
  140.     }
  141.     fact[0] = inv[0] = 1;
  142.     for(int i=1 ; i<=n ; i++){
  143.         fact[i] = mul(i , fact[i-1]);
  144.         inv[i] = bp(fact[i] , mod-2);
  145.     }
  146.     vector<ii > v;
  147.     for(int i=0 ; i<n ; i++){
  148.         v.push_back(ii(mn[i] , 0));
  149.         v.push_back(ii(mx[i] , 1));
  150.     }
  151.     sort(v.begin() , v.end());
  152.     int numa=0 , numb=0 , ans=0;
  153.     for(int i=2*n-1 ; i>=0 ; i--){
  154.         numa += (v[i].second == 0);
  155.         numb += v[i].second;
  156.         if(v[i].second && numb >= B){
  157.             for(int j=0 ; j<=B-1 && j<=numa ; j++){
  158.                 int cnt = numa-j;
  159.                 if(cnt>A-B)
  160.                     continue;
  161.                 ans = add(ans , mul(C(j , numa) , C(B-j-1 , numb-1-numa)));
  162.             }
  163.         }
  164.     }
  165.     printf("%d\n" , ans);
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement