7.30 Test——Math Theory 2

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;
}
a

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

猜你喜欢

转载自www.cnblogs.com/Joker-Yza/p/11272465.html