Java写的,为了图快变量名比较逗逼,请见谅
第一题
import java.util.*;
public class test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int no = in.nextInt();
            List<List<Integer>> kezhi = new ArrayList<>();
            for(int i = 0; i < no; i++) {
                String kezhi_str = in.next();
                ArrayList<Integer> kezhi_lst = new ArrayList<>();
                for(char c: kezhi_str.toCharArray()) {
                    kezhi_lst.add(c - '0');
                }
                kezhi.add(kezhi_lst);
            }
            int cnt = generateMethod(kezhi, no-1).size();
            System.out.println(cnt);
        }
    }

    public static List<Set<Integer>> generateMethod(List<List<Integer>> kezhi, int i) {
        if(i == 0) {
            List<Set<Integer>> res = new ArrayList<>();
            for(int duishou: kezhi.get(0)) {
                Set<Integer> duishoujihe = new HashSet<>();
                duishoujihe.add(duishou);
                res.add(duishoujihe);
            }
            return res;
        } else {
            List<Set<Integer>> zhiqianduishoujiheliebiao = generateMethod(kezhi, i-1);
            List<Set<Integer>> res = new ArrayList<>();
            for(Set<Integer> zhiqianduishoujihe: zhiqianduishoujiheliebiao) {
                for(int duishou: kezhi.get(i)) {
                    if(!zhiqianduishoujihe.contains(duishou)) {
                        Set<Integer> xinduishoujihe = new HashSet<>();
                        xinduishoujihe.addAll(zhiqianduishoujihe); xinduishoujihe.add(duishou);
                        res.add(xinduishoujihe);
                    }
                }
            }
            return res;
        }
    }
}

第一题简单地利用递归就能满足要求了,不用想得很复杂,就算超时了再改就行了
***************************************************************************************************
第二题
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class test2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLong()) {
            int cost = in.nextInt();
            long money = in.nextInt();
            long cnt = 0;
            long min_paid = (long)Math.ceil(cost/0.95);
            long max_paid = Math.min((long)Math.floor(cost/0.90), money);
            while(min_paid%5 != 0) min_paid++;
            while (max_paid%5 != 0) max_paid--;
            if(max_paid >= min_paid)
                cnt = (max_paid - min_paid) / 5 + 1;
            System.out.println(cnt);
        }
    }
}
第二题主要是int有可能会溢出,所以尽量用long,还有就是边界处理有一点麻烦
************************************************************************************************
第三题
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class test3 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            long S = in.nextLong();
            long cnt = 0;
            for(long i = 0; i*i < S; i++) {
                long resi = S - i*i;
                if(hasRoot(resi)) cnt++;
            }
            System.out.println(cnt*4);
        }
    }

    public static boolean hasRoot(long i) {
        if(i == 0 || i == 1) return true;
        long p = 0, r = i;
        while(true) {
            long q = p + (r-p)/2;
            if(q*q > i) r = q;
            else if(q*q < i) p = q;
            else return true;
            if(p > r) return false;
            if(r-p <= 1) {
                if(r*r == i || p*p == i) return true;
                else return false;
            }
        }
    }
}
第三题也是可能有溢出问题,所有直接上long,然后就是判断整数有没有根用了一个二分法