Pagini recente » Cod sursa (job #2826755) | Cod sursa (job #2204128) | Cod sursa (job #3208182) | Cod sursa (job #2644110) | Cod sursa (job #2731128)
#include <bits/stdc++.h>
using namespace std;
//ifstream f("date.in");
//ofstream g("date.out");
#define f cin
#define g cout
const int dim = 2e5 + 2;
const int mod = 1e9 + 7;
int n, t, p, k;
bitset <22> v[dim];
void read(){
f >> n >> k;
char c;
for(int i = 1; i <= n; ++i){
for(int j = 0; j < k; ++j){
f >> c;
v[i][j] = c - '0';
}
}
}
void solve1(){
bitset <22> aux = v[1];
int nr = 0;
for(int i = 2; i <= n; ++i){
aux |= v[i];
if(aux.count() == k){
++nr;
aux = {};
}
}
if(aux.count() == k)
++nr;
g << nr << '\n';
}
vector < vector <int> > poz;
void solve2(){
vector <int> aux(k + 1, 0);
for(int i = 1; i <= n; ++i){
bool ok = 1;
for(int j = 0; j < k; ++j){
aux[j] += v[i][j];
if(aux[j] == 0)
ok = 0;
}
if(ok){
aux[k] = i;
poz.push_back(aux);
aux.assign(k + 1, 0);
}
}
for(int i = 0; i <= k; ++i)
poz[poz.size() - 1][i] += aux[i];
/*
for(auto it: poz){
for(int it2: it)
g << it2 << " ";
g << '\n';
}
*/
long long ans = 1;
long long nr = 1;
for(int i = 1; i < poz.size(); ++i){
nr = 1;
for(int j = poz[i - 1].back() + 1; j < n; ++j){
int o;
for(o = 0; o < k; ++o){
poz[i][o] -= v[j][o];
if(poz[i][o] == 0)
break;
}
if(o == k){
++nr;
if(i < poz.size() - 1)
for(o = 0; o < k; ++o){
poz[i + 1][o] += v[j][o];
}
} else {
ans = (ans * nr) % mod;
nr = 1;
break;
}
}
}
ans = (ans * nr) % mod;
g << ans << '\n';
}
void restart(){
for(int i = 1; i <= n; ++i)
v[i] = {};
poz.clear();
}
void nos(){
ios :: sync_with_stdio(false);
cin.tie(NULL);
}
int main(){
nos();
f >> p >> t;
for(int i = 1; i <= t; ++i){
read();
switch(p){
case 1:
solve1();
break;
case 2:
solve2();
break;
}
restart();
}
return 0;
}