#include<iostream> #include<vector> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<map> using namespace std; int n,k,licznik=1; char tab[3002][3002]; int vis[3002][3002]; long long suma=0,m=1000000007,po_dwa=0,dwojki=0; vector<pair<int, int> > kol; long long il[4], wychodzace_dwojki[5], wspolne_dwojki[5],policz=0;//1-pojedyncz, 2-podwojne, 3-potrojne, 4- poczworne void bfs(int i,int j) { int dwojki[5]={0};//1-pojedyncz, 2-podwojne, 3-potrojne, 4- poczworne int ile_wychodzacych=0; //cout <<i <<" "<<j <<endl; map < pair<int,int> ,int > odl; map < pair<int,int> ,pair<int,int> > oj; queue<int> kolx,koly; kolx.push(i); koly.push(j); odl[make_pair(i,j)] = 0; while(!kolx.empty()) { int i=kolx.front(); kolx.pop(); int j=koly.front(); koly.pop(); if(tab[i-1][j]=='.' && oj[make_pair(i-1,j)] != make_pair(i,j) && vis[i-1][j] >= 0) { oj[make_pair(i-1,j)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i-1][j]++;} odl[make_pair(i-1,j)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i-1); koly.push(j); } } if(tab[i+1][j]=='.' && oj[make_pair(i+1,j)] != make_pair(i,j) && vis[i+1][j] >= 0) { oj[make_pair(i+1,j)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i+1][j]++;} odl[make_pair(i+1,j)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i+1); koly.push(j); } } if(tab[i][j-1]=='.' && oj[make_pair(i,j-1)] != make_pair(i,j) && vis[i][j-1] >= 0) { oj[make_pair(i,j-1)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i][j-1]++;} odl[make_pair(i,j-1)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i); koly.push(j-1); } } if(tab[i][j+1]=='.' && oj[make_pair(i,j+1)] != make_pair(i,j) && vis[i][j+1] >= 0) { oj[make_pair(i,j+1)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i][j+1]++;} odl[make_pair(i,j+1)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i); koly.push(j+1); } } } wychodzace_dwojki[ile_wychodzacych]++; } int policz_wspolne(int i,int j) { int ile = 0; if(tab[i-1][j]=='.' && tab[i][j+1]=='.' && tab[i-1][j+1]=='.') { ile++; } if(tab[i][j+1]=='.' && tab[i+1][j]=='.' && tab[i+1][j+1]=='.' ) { ile++; } if(tab[i+1][j]=='.' && tab[i][j-1]=='.' && tab[i+1][j-1]=='.') { ile++; } if( tab[i][j-1]=='.' && tab[i-1][j]=='.' && tab[i-1][j-1]=='.' ) { ile++; } return ile; } long long k_nad_n(int k,int n){ long long wyn = 1; for(int i = n - k + 1 ; i <= n; ++i) {wyn *= i;} for(int i = 2; i <= k ; ++i) wyn /= i; return wyn%m; } /////////////////////////////////////// int main() { int i, j; scanf("%d%d",&n,&k); for(i=1;i<n+1;++i) scanf("%s",&tab[i][1]); for(i=0;i<n+2;++i) tab[i][0] = tab[i][n+1] = '#'; for(j=0;j<n+2;++j) tab[0][j] = tab[n+1][j] ='#'; /* cout <<endl; for(i=0;i<n+2;++i) {for(j=0;j<n+2;++j) cout <<tab[i][j]; cout <<endl;} */ for(i=1;i<n+1;++i) for(j=1;j<n+1;++j) { if(tab[i][j] == '#'){ if(tab[i+1][j]=='.' && vis[i+1][j] ==0){ kol.push_back(make_pair(i+1,j)); vis[i+1][j]=-1; } if(tab[i-1][j]=='.' && vis[i-1][j] ==0){ kol.push_back(make_pair(i-1,j)); vis[i-1][j]=-1; } if(tab[i][j+1]=='.' && vis[i][j+1] ==0){ kol.push_back(make_pair(i,j+1)); vis[i][j+1]=-1; } if(tab[i][j-1]=='.' && vis[i][j-1] ==0){ kol.push_back(make_pair(i,j-1)); vis[i][j-1]=-1; } } } il[0]=kol.size(); //for(i = 0; i < kol.size();++i) vis[kol[i].first][kol[i].second]=0; for(i = 0; i < kol.size();++i) { bfs(kol[i].first,kol[i].second);licznik++; } //for(j = 0; j < 4;++j) cout << il[j]<<" "; cout << endl;} for(i=1;i<n+1;++i) for(j=1;j<n+1;++j) if(vis[i][j]>0) {wspolne_dwojki[vis[i][j]]++,dwojki++;} //for(i = 0; i < kol.size();++i) cout << kol[i].first<<" "<<kol[i].second<<endl; //for(i = 0; i < 4;++i) cout << il[i]<<" "; cout << endl; if(k==1) { suma = kol.size() ; //printf("%lld\n",suma); } if(k==2) { suma += il[1];//2 suma += (k_nad_n(2,kol.size() ) )%m;//1 + 1 //printf("%lld\n",suma); } if(k==3){ suma += (il[2])%m ;//3 //cout << (il[2])%m << endl; suma += ((il[1])*(kol.size() - 1)-wspolne_dwojki[2] - wspolne_dwojki[3]*3 - wspolne_dwojki[4]*6)%m ;//2 + 1 //cout << ((il[1])*(kol.size() - 1)-wspolne_dwojki[2] - wspolne_dwojki[3]*3 - wspolne_dwojki[4]*6)%m <<endl; suma += (k_nad_n(3,kol.size() ))%m; //1 + 1 +1 //cout << (k_nad_n(3,kol.size() ))%m << endl; //printf("%lld\n",suma); } if(k==4){ suma += il[3];// 4 -ilosc takich, z ktorych wychodza pod katem prostym 2 for(i = 0; i < kol.size();++i) policz += policz_wspolne(kol[i].first,kol[i].second); suma -= policz; po_dwa = (wychodzace_dwojki[3]*3*(il[1] - 3) + wychodzace_dwojki[2]*2*(il[1] - 2) + wychodzace_dwojki[1]*1*(il [1] - 1))%m;//2 + 2 po_dwa = (po_dwa - 2*wspolne_dwojki[2] - 3*wspolne_dwojki[3] - 4*wspolne_dwojki[4])%m; suma += po_dwa; suma += ((il[1] )*k_nad_n(2,kol.size()-1 ) - wspolne_dwojki[2] - wspolne_dwojki[3]*2 - wspolne_dwojki[4]*3)%m;//2 + 1 + 1 suma += (il[2] * (kol.size() -1))%m;//3 + 1 suma += (k_nad_n(4,kol.size() ))%m;//1 + 1 + 1 + 1 j++; //printf("%lld\n",suma); } printf("%lld\n",suma%m); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | #include<iostream> #include<vector> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<map> using namespace std; int n,k,licznik=1; char tab[3002][3002]; int vis[3002][3002]; long long suma=0,m=1000000007,po_dwa=0,dwojki=0; vector<pair<int, int> > kol; long long il[4], wychodzace_dwojki[5], wspolne_dwojki[5],policz=0;//1-pojedyncz, 2-podwojne, 3-potrojne, 4- poczworne void bfs(int i,int j) { int dwojki[5]={0};//1-pojedyncz, 2-podwojne, 3-potrojne, 4- poczworne int ile_wychodzacych=0; //cout <<i <<" "<<j <<endl; map < pair<int,int> ,int > odl; map < pair<int,int> ,pair<int,int> > oj; queue<int> kolx,koly; kolx.push(i); koly.push(j); odl[make_pair(i,j)] = 0; while(!kolx.empty()) { int i=kolx.front(); kolx.pop(); int j=koly.front(); koly.pop(); if(tab[i-1][j]=='.' && oj[make_pair(i-1,j)] != make_pair(i,j) && vis[i-1][j] >= 0) { oj[make_pair(i-1,j)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i-1][j]++;} odl[make_pair(i-1,j)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i-1); koly.push(j); } } if(tab[i+1][j]=='.' && oj[make_pair(i+1,j)] != make_pair(i,j) && vis[i+1][j] >= 0) { oj[make_pair(i+1,j)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i+1][j]++;} odl[make_pair(i+1,j)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i+1); koly.push(j); } } if(tab[i][j-1]=='.' && oj[make_pair(i,j-1)] != make_pair(i,j) && vis[i][j-1] >= 0) { oj[make_pair(i,j-1)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i][j-1]++;} odl[make_pair(i,j-1)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i); koly.push(j-1); } } if(tab[i][j+1]=='.' && oj[make_pair(i,j+1)] != make_pair(i,j) && vis[i][j+1] >= 0) { oj[make_pair(i,j+1)] =make_pair(i,j); int o = odl[make_pair(i,j)]; if(o==0) {ile_wychodzacych++;vis[i][j+1]++;} odl[make_pair(i,j+1)] = o + 1; il[o+1]++; if(o < k-2) { kolx.push(i); koly.push(j+1); } } } wychodzace_dwojki[ile_wychodzacych]++; } int policz_wspolne(int i,int j) { int ile = 0; if(tab[i-1][j]=='.' && tab[i][j+1]=='.' && tab[i-1][j+1]=='.') { ile++; } if(tab[i][j+1]=='.' && tab[i+1][j]=='.' && tab[i+1][j+1]=='.' ) { ile++; } if(tab[i+1][j]=='.' && tab[i][j-1]=='.' && tab[i+1][j-1]=='.') { ile++; } if( tab[i][j-1]=='.' && tab[i-1][j]=='.' && tab[i-1][j-1]=='.' ) { ile++; } return ile; } long long k_nad_n(int k,int n){ long long wyn = 1; for(int i = n - k + 1 ; i <= n; ++i) {wyn *= i;} for(int i = 2; i <= k ; ++i) wyn /= i; return wyn%m; } /////////////////////////////////////// int main() { int i, j; scanf("%d%d",&n,&k); for(i=1;i<n+1;++i) scanf("%s",&tab[i][1]); for(i=0;i<n+2;++i) tab[i][0] = tab[i][n+1] = '#'; for(j=0;j<n+2;++j) tab[0][j] = tab[n+1][j] ='#'; /* cout <<endl; for(i=0;i<n+2;++i) {for(j=0;j<n+2;++j) cout <<tab[i][j]; cout <<endl;} */ for(i=1;i<n+1;++i) for(j=1;j<n+1;++j) { if(tab[i][j] == '#'){ if(tab[i+1][j]=='.' && vis[i+1][j] ==0){ kol.push_back(make_pair(i+1,j)); vis[i+1][j]=-1; } if(tab[i-1][j]=='.' && vis[i-1][j] ==0){ kol.push_back(make_pair(i-1,j)); vis[i-1][j]=-1; } if(tab[i][j+1]=='.' && vis[i][j+1] ==0){ kol.push_back(make_pair(i,j+1)); vis[i][j+1]=-1; } if(tab[i][j-1]=='.' && vis[i][j-1] ==0){ kol.push_back(make_pair(i,j-1)); vis[i][j-1]=-1; } } } il[0]=kol.size(); //for(i = 0; i < kol.size();++i) vis[kol[i].first][kol[i].second]=0; for(i = 0; i < kol.size();++i) { bfs(kol[i].first,kol[i].second);licznik++; } //for(j = 0; j < 4;++j) cout << il[j]<<" "; cout << endl;} for(i=1;i<n+1;++i) for(j=1;j<n+1;++j) if(vis[i][j]>0) {wspolne_dwojki[vis[i][j]]++,dwojki++;} //for(i = 0; i < kol.size();++i) cout << kol[i].first<<" "<<kol[i].second<<endl; //for(i = 0; i < 4;++i) cout << il[i]<<" "; cout << endl; if(k==1) { suma = kol.size() ; //printf("%lld\n",suma); } if(k==2) { suma += il[1];//2 suma += (k_nad_n(2,kol.size() ) )%m;//1 + 1 //printf("%lld\n",suma); } if(k==3){ suma += (il[2])%m ;//3 //cout << (il[2])%m << endl; suma += ((il[1])*(kol.size() - 1)-wspolne_dwojki[2] - wspolne_dwojki[3]*3 - wspolne_dwojki[4]*6)%m ;//2 + 1 //cout << ((il[1])*(kol.size() - 1)-wspolne_dwojki[2] - wspolne_dwojki[3]*3 - wspolne_dwojki[4]*6)%m <<endl; suma += (k_nad_n(3,kol.size() ))%m; //1 + 1 +1 //cout << (k_nad_n(3,kol.size() ))%m << endl; //printf("%lld\n",suma); } if(k==4){ suma += il[3];// 4 -ilosc takich, z ktorych wychodza pod katem prostym 2 for(i = 0; i < kol.size();++i) policz += policz_wspolne(kol[i].first,kol[i].second); suma -= policz; po_dwa = (wychodzace_dwojki[3]*3*(il[1] - 3) + wychodzace_dwojki[2]*2*(il[1] - 2) + wychodzace_dwojki[1]*1*(il [1] - 1))%m;//2 + 2 po_dwa = (po_dwa - 2*wspolne_dwojki[2] - 3*wspolne_dwojki[3] - 4*wspolne_dwojki[4])%m; suma += po_dwa; suma += ((il[1] )*k_nad_n(2,kol.size()-1 ) - wspolne_dwojki[2] - wspolne_dwojki[3]*2 - wspolne_dwojki[4]*3)%m;//2 + 1 + 1 suma += (il[2] * (kol.size() -1))%m;//3 + 1 suma += (k_nad_n(4,kol.size() ))%m;//1 + 1 + 1 + 1 j++; //printf("%lld\n",suma); } printf("%lld\n",suma%m); return 0; } |