T1和T2很简单就不写了。
2020.9.6

/** * 式子求值 * 对于序列a下标从1开始到n * 定义一个式子:bi=ai⊕⊕{j=1,n}(i%j) * 求⊕{i=1,n}(bi)的值 * ⊕是异或运算 * bi = ai⊕(i%1)⊕(i%2)⊕(i%3)...⊕(i%n) * n<=100000,0<=ai<=n(此处感觉有问题。。。因为样例与这个矛盾。问他们说自己理解。。) * * b1 = a1⊕(1%1)⊕(1%2)⊕(1%3)...⊕(1%n) * b2 = a2⊕(2%1)⊕(2%2)⊕(2%3)...⊕(2%n) * ... * 因为异或运算满***换律的,从这里可以看出,就是对于(1~n)%1⊕(1~n)%2....的值和a的异或 * 于是就可以计算出异或值后,(1~n)%i如果是偶数就为arr[n%i]的值,否则就是arr[n%i]的值异或arr[i-1]的值 * emmm感觉还是看程序自己领会一下吧。。 */
import java.util.Scanner;
public class T3 {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a[] = new int[n+1];
		int ans = 0;
		for(int i = 1;i<=n;i++) {
   
			a[i] = sc.nextInt();
			ans^=a[i];
		}
		int arr[] = new int[100005];
		for(int i = 1;i<100005;i++) {
   
			arr[i] = i^arr[i-1];
		}
		for(int i = 1;i<=n;i++) {
   
			ans^=arr[n%i]^arr[i*((n/i)%2)==0?0:i*((n/i)%2)-1];
		}
		System.out.println(ans);
	}
}


import java.util.Arrays;
import java.util.Scanner;
/** * 第四题 * 公司有n(n<24)个人,对于每个人只能有一个直系上司 * 对于每个人他的下属和他自己的总数是ai * 问能否构成一个关系满足, * 每个人最少有两个下属,或者没有下属。 * 对于除最高职位的人,都有且只有一个直系上司。 * 问能否根据ai建立关系树。 * * 就是一个搜索加上回溯问题,把最高的当做根节点,然后找到和为父节点的值,将这几个当为父节点,进行递归处理。 * 如果对于排序好的,从高到底的安排节点,不进行回溯,能过45%。会丧失对于较大的节点是另外更大节点的儿子节点,能够组成数的情况。 * */
public class T4 {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
   
			int n = sc.nextInt();
			int arr[] = new int[n];
			for (int i = 0; i < n; i++) {
   
				arr[i] = sc.nextInt();
			}
			Arrays.sort(arr);
			boolean flag = sl(arr[arr.length - 1], 0, 0, arr);
			if (flag) {
   
				System.out.println("YES");
			} else {
   
				System.out.println("NO");
			}
		}
	}

	static boolean sl(int f, int z, int used, int arr[]) {
   
		int sum = 0;
		int cont = 0;
		if(f==1) {
   
			return true;
		}
		int use = used;
		for (int j = arr.length - 2; j >= 0; j--) {
   
			for (int i = j; i >= 0; i--) {
   
				if ((use & (1 << i)) == 0 && sum + arr[i]+1 <= f) {
   
					sum += arr[i];
					use |= (1 << i);
					z |= (1 << i);
					cont++;
					if (sum + 1 == f) {
   
						break;
					}
				}
			}
			if (sum + 1 != f) {
   
				return false;
			}
			boolean flag = false;
			if (cont > 1) {
   
				for (int i = 1; i < arr.length; i++) {
   
					if ((z & 1 << i) != 0) {
   
						if (arr[i] != 1) {
   
							flag = sl(arr[i], 0, use, arr);
							if (!flag) {
   
								break;
							}
						} else {
   
							use |= 1 << i;
						}

					}
				}
			}else {
   
				return false;
			}
// for(int i = 1;i<arr.length;i++) {
   
// if((use&(1<<i))==0) {
   
// return false;
// }
// }
		}
		return true;
	}
}
/* * 3 1 1 3 2 1 2 * * YES NO */

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
/** * 第二部分题 * 就是对于m次点名每次把队列中的人叫到第一个,把没在队列的添到第一个。 * 问队列的学生的编号 * 这个把点名倒过来就行了。。。 * 最后点的一定在最前面。然后在前面再次出现就不用管了。。。就行了。 */
public class T1 {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int a[] = new int[m];
		while(m-->0) {
   
			a[m] = sc.nextInt();
		}
		HashSet<Integer> hs = new HashSet<Integer>();
		ArrayList<Integer> al = new ArrayList<Integer>();
		for(int i = 0;i<a.length;i++) {
   
			if(!hs.contains(a[i])) {
   
				al.add(a[i]);
				hs.add(a[i]);
			}
		}
		for (Integer integer : al) {
   
			System.out.println(integer);
		}
	}
}