T1简单没套路,T3 a不完。。所以只有T2和T4

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/** * 第二题 * 给定一个m*n的由0 1组成的矩阵。每个1代表一个士兵 * 上下左右相连的兵可以组成一个团 * 现在可以移动一个士兵的位置,可以把他从任何位置移动到任何另一个位置 * 问,能组成的最大团的士兵数。 * 样例 4 4 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 8 * * 这题是考bfs的。。。利用bfs将士兵组成团,然后对于每个团进行编号。 * 在没有士兵位置的地方,计算临近四个位置所在的团的人数之和。就是将士兵移到这个位置所组成的最大团的人数。 * 如果人数和最大团相同,那么这个士兵就是从这几个团中移到这里的,否则就是从其他团移到这里,这时就要加1构成最大值。 * * *记住不能胡乱粘贴。。。因不注意修改条件直接复制粘贴导致结果总是1 。。。debug到笔试结束,痛苦。。。 */
public class T2 {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		Node arr[][] = new Node[n][m];
		boolean use[][] = new boolean[n][m];
		int num1 = 0;
		for (int i = 0; i < n; i++) {
   
			for (int j = 0; j < m; j++) {
   
				arr[i][j] = new Node(i, j, sc.nextInt());
				if (arr[i][j].data == 1) {
   
					num1++;
				}
			}
		}
		int zln = 1;
		for (int i = 0; i < n; i++) {
   
			for (int j = 0; j < m; j++) {
   
				if (arr[i][j].data == 1 && use[i][j] == false) {
   
					Queue<Node> q = new LinkedList<Node>();
					q.add(arr[i][j]);
					use[i][j] = true;
					while (!q.isEmpty()) {
   
						Node te = q.poll();
						te.zl = zln;
						if (te.i - 1 >= 0 && !use[te.i - 1][te.j] && arr[te.i - 1][te.j].data == 1) {
   
							q.add(arr[te.i - 1][te.j]);
							use[te.i - 1][te.j] = true;
						}
						if (te.i + 1 < n && !use[te.i + 1][te.j] && arr[te.i + 1][te.j].data == 1) {
   
							q.add(arr[te.i + 1][te.j]);
							use[te.i + 1][te.j] = true;
						}
						if (te.j - 1 >= 0 && !use[te.i][te.j - 1] && arr[te.i][te.j - 1].data == 1) {
   
							q.add(arr[te.i][te.j - 1]);
							use[te.i][te.j - 1] = true;
						}
						if (te.j + 1 < m && !use[te.i][te.j + 1] && arr[te.i][te.j + 1].data == 1) {
   
							q.add(arr[te.i][te.j + 1]);
							use[te.i][te.j + 1] = true;
						}

					}
					zln++;
				}
			}
		}
		int ans[] = new int[zln];
		for (int i = 0; i < n; i++) {
   
			for (int j = 0; j < m; j++) {
   
				if (arr[i][j].data != 0)
					ans[arr[i][j].zl]++;
			}
		}
		int out = 0;

		HashSet<Integer> hs = new HashSet<Integer>();
		for (int i = 0; i < n; i++) {
   
			for (int j = 0; j < m; j++) {
   
				int teout = 0;
				if (arr[i][j].data == 0) {
   
					if (i - 1 >= 0 && arr[i - 1][j].data == 1) {
   
						hs.add(arr[i - 1][j].zl);
					}
					if (i + 1 < n && arr[i + 1][j].data == 1) {
   
						hs.add(arr[i + 1][j].zl);
					}
					if (j - 1 >= 0 && arr[i][j - 1].data == 1) {
   
						hs.add(arr[i][j - 1].zl);
					}
					if (j + 1 < m && arr[i][j + 1].data == 1) {
   
						hs.add(arr[i][j + 1].zl);
					}
				}
				for (Integer integer : hs) {
   
					teout += ans[integer];
				}
				hs.clear();
				if (teout != num1) {
   
					teout++;
				}
				out = Math.max(teout, out);
			}
		}
		System.out.println(out);
	}
}

class Node {
   
	int data;
	int zl;
	int i;
	int j;

	public Node() {
   
	}

	public Node(int i, int j, int data) {
   
		this.i = i;
		this.j = j;
		this.data = data;
	}

}
import java.util.HashSet;
import java.util.Scanner;
/** * 第四题 * 给定一个数n(n<1000000000) 和 一个数组a[m] m (1<=m<=10,1<=a[i]<=20) * 如果n对于一个数 ai有n%ai==0,则认为两个数相关。 * 问在 1 - n中有多少个相关 * 样例 10 2 2 3 5 * 这题是考容斥原理的题。当然要提前处理一下数值,不能有倍数关系。 * 去除倍数关系之后进行计算值就可 */
public class T4 {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		long n = sc.nextLong();
		int m = sc.nextInt();
		HashSet<Integer> hs = new HashSet<Integer>();
		long ans = 0;
		for(int i = 0;i < m; i++) {
   
			hs.add(sc.nextInt());
		}
		int arr[] = new int[hs.size()];
		int temp = 0;
		for (Integer integer : hs) {
   
			arr[temp++] = integer;
		}
		for(int i = 0;i<arr.length;i++) {
   
			for(int j = i+1;j<arr.length;j++) {
   
				if(Math.max(arr[i], arr[j])%Math.min(arr[i], arr[j])==0) {
   
					hs.remove(Math.max(arr[i], arr[j]));
				}
			}
		}
		arr = new int[hs.size()];
		temp = 0;
		for (Integer integer : hs) {
   
			arr[temp++] = integer;
		}
		for(int i = 1;i<1<<arr.length;i++) {
   
			int num = 0;
			long test = 1;
			for(int t = i,j=0;t!=0;t>>=1,j++) {
   
				if((t&1)!=0) {
   
					num++;
					test *= arr[j];
				}
			}
			if((num&1)==0) {
   
				ans-=n/test;
			}else {
   
				ans+=n/test;
			}
		}
		System.out.println(ans);
	}
	static int gcd(int a, int b) {
   
		if(b==0) {
   
			return a;
		}else {
   
			return gcd(b,a%b);
		}
	}
}