T1:
1 难题
1.1 Description
珈百璃正在看 ZJOI 2018 的一道题“线图”。
对于无向图G = (V, E),它的线图L(G)也是一个无向图:
它的点集大小为|E|,每个点唯一对应着原图的一条边。
两个点之间有边当且仅当这两个点对应的边在原图上有公共点(注意不会有自环)。
ZJOI 那道题要对一棵树G 求L(L(L(L(L(L(L(L(L(G)))))))))的点数,
这对九条可怜很简单,但对珈百璃太难了,于是珈百璃打算先解决一个更简单的问题:
对一棵树G,求L(L(G))的点数。
1.2 Task
1.2.1 Input
第一行一个正整数n 表示G 的点数;
接下来n - 1每行两个数表示G 的一条边。
1.2.2 Output
一行一个数表示答案。
1.3 Sample
1.3.1 Input
5
1 2
2 3
2 5
3 4
1.3.2 Output
4
1.4 Constraint
对于30%的数据,n <= 100;
对于100%的数据,n <= 105。
1.5 Hint
这张图描绘了样例中的G,L(G) 和 L(L(G))。
解析:
难题还真是难啊
不难看出就是求L(G)中的边数, L(G)中的边, 由原图中有公共点的两条边变成点后连接而成, 因此考虑枚举原图中的交点, 与它相连的边在L(G)中变成点后就会两两相连,所以一个原图中的交点对答案产生的贡献为C(deg, 2), 其中deg是它的度数
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100004; int n, deg[maxn]; ll ans; int main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); scanf("%d", &n); for(int i = 1; i < n; ++i) { int x, y; scanf("%d%d", &x, &y); deg[x] ++; deg[y] ++; } for(int i = 1; i <= n; ++i) ans += 1LL * deg[i] * (deg[i] - 1) / 2; printf("%lld", ans); return 0; }
T2:
2 简单题1
2.1 Description
珈百璃刚刚学习了杜教筛,想做一道简单题练练手。给出N,求:
$\sum_{i = 1}^{N}i\mu (i)$
答案模109 + 7。
2.2 Task
2.2.1 Input
一行一个正整数N。
2.2.2 Output
一行一个数表示答案。
2.3 Sample
2.3.1 Input
15
2.3.2 Output
5
2.4 Constraint
对于30%的数据,N <= 106;
对于60%的数据,N <= 109;
对于100%的数据,N <= 1010。