携程0313 笔试 总共80分?
第三 1,质数因子个数+最小子数组和
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static int[] b = new int[10001];
static {
/**计算出1-10000所有的质数 埃氏筛 */
boolean[]isP = new boolean[10001];
Arrays.fill(isP, true);
//取出下一个质数,所有该质数的倍数去掉
for (int i = 2; i <= 10000; i++) {
if (!isP[i])continue;
/**质数 i*/
for (int k = 2; k * i <= 10000; k++)isP[k * i] = false;
}
isP[1] = false;
isP[0] = false;
/**所有的数字的权值(质因子个数) */
for (int j = 2; j <= 10000; j++) {
if (isP[j])
for (int p = 1; p * j <= 10000; p++)b[p * j]++;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), k = in.nextInt();
int[]a = new int[n];
for (int i = 0; i < n; i++)a[i] = in.nextInt();
/**
删除权值和最小的子数组 ===>前缀和
计算出前缀 权值和
*/
int[]pre = new int[n + 1];
for (int i = 0; i < n; i++) {
pre[i + 1] = pre[i] + b[a[i]];
}
int mn = pre[n];
for (int st = 0; st + k - 1 <= n - 1; st++) {
int o = pre[st + k] - pre[st];
mn = Math.min(mn, o);
}
System.out.print(pre[n] - mn);
}
}
第四 0.94偶尔0.87,偶数路径个数,真的找不到哪里还能再快了
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
/**
求全为偶数的路径
12
/ \
16 3
/
4
long dfs(i): i节点为终点的 偶数路径 个数
无论当前a[i]是奇数还是偶数,都需要往下继续dfs
1. 如果i节点为奇数直接返回0,
2. 如果i节点为偶数
同时 ans+= 1 + sum(子节点) + sum(j1*j2,j2*j3,....)
返回的是 1+sum(子节点)
*/
public class Main {
public static long ans = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
boolean[]a = new boolean[n + 1];
for (int i = 0; i < n; i++)a[i + 1] = in.nextInt() % 2 == 0;
List<Integer>[]g = new List[n + 1];
Arrays.setAll(g, i->new ArrayList());
for (int i = 0; i < n - 1; i++) {
int u = in.nextInt(), v = in.nextInt();
g[u].add(v);
g[v].add(u);
}
dfs(1, 0, g, a);
System.out.print(ans);
}
public static long dfs(int i, int fa, List<Integer>[]g, boolean[]a) {
if (g[i].size() == 1 && fa != 0) { //叶子节点直接返回
int c = a[i] ? 1 : 0;
ans += c;
return c;
}
long res = 0; //这个节点的返回个数
long a1 = 0; //用于组合计数的
// 子节点j, 无论当前节点是否为奇数都需要往下dfs
for (int j : g[i]) {
if (j == fa)continue;
long rj = dfs(j, i, g, a);
a1 += res * rj;
res += rj;
}
ans += a[i] ? 1 + res + a1 : 0;
return a[i] ? res + 1 : 0;
}
}
