abc 096 D 素数判定

C
H 行 W 列のマス目で表されるキャンバスがあります. 上から i 番目, 左から j 番目のマスを (i,j) と表します.
最初, すべてのマス目は白色です. square1001 君は, 黒い絵の具を使って絵を描きたいと思いました. 具体的には, square1001 君の目標は, si,j= # のときマス (i,j) を黒色, si,j= . のときマス (i,j) を白色にすることです.
しかし, 彼は絵を描くことが得意ではないので, 何回か (0 回でもよい)「上下左右に隣接する 2 つのマスを選び, 両方黒く塗る」ことしかできません. ただし, すでに黒く塗られているマスを選ぶこともでき, この場合マスの色は黒のまま変わりません. 
square1001 君が目標を達成することができるか判定してください. 
制約
H は 1 以上 50 以下の整数
W は 1 以上 50 以下の整数
すべての (i,j) (1≤i≤H,1≤j≤W) に対して, si,j は # または .

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int H, W;
	int ans = 0;
	char C[55][55];
	cin >> H >> W;
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			cin >> C[i][j];
		}
	}
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			if (C[i][j] == '#'&&C[i][j - 1] != '#'&&C[i - 1][j] != '#'
				&&C[i][j + 1] != '#'&&C[i + 1][j] != '#')
				ans++;
		}
	}
	if (ans == 0)cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}
```
C[I-1][j]とかが定義されてない範囲にきても大丈夫なのな

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int H, W;
	cin >> H >> W;
	char s[55][55];
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			cin >> s[i][j];
		}
	}
	int dx[4] = { 1,0,-1,0 };
	int dy[4] = { 0,1,0,-1 };
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			if (s[i][j] == '.')continue;
			bool can = false;
			for (int k = 0; k < 4; ++k) {
				int ny = i + dy[k];
				int nx = j + dx[k];
				if (nx >= 0 && nx < W&&ny >= 0 && ny < H) {
					if (s[ny][nx] == '#')can = true;
				}
			}
			if (!can) {
				cout << "No" << endl;
				return 0;
			}
		}
	}
	cout << "Yes" << endl;
	return 0;
}
```
こっちのほうがしっくりくるな

D

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<iomanip>
using namespace std;
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
#define NREP(i, n) FOR(i, 1, n)
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const ll dx[4] = { 0, -1, 1, 0 };
const ll dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
int gcd(int x, int y) {
	if (x < y)swap(x, y);
	if (y == 0)return x;
	return gcd(y, x%y);
}
////////////////////////////////////////

//5で割った余りが１の素数をn個出力する
int n;
vector<int>prime;
//primeに素数をぶち込む
void MakePrime(int n) {
	prime.emplace_back(2);
	for (int i = 3; i <= n; i += 2) {
		bool a = false;
		for (int j = 3; j <= sqrt(i); j += 2) {
			if (i%j == 0) {
				a = true;
			}
		}
		if (a == false) {
			prime.emplace_back(i);
		}
	}
}
int main() {
	cin >> n;
	MakePrime(55555);
	int cnt = 0;
	int pos = 0;
	while (cnt < n) {
		if (prime[pos] % 5 == 1) {
			if (cnt)cout << " ";
			cout << prime[pos];
			cnt++;
		}
		pos++;
	}
	cout << endl;

	return 0;
}
```