9/10
题A 18114 Ly and PostCards
题意:要发明信片,有n个人,选其中的k个人来发,但是有一个规定,就是选了a的话,如果a和b关系好的,b也要寄给,所以给出m对关系好的,让你随机选k个人,求最后要发给的人数的期望,为了不输出浮点数,就将结果乘以C(n,k);
题解:期望题一般都是考虑各种情况,把所有情况都考虑清晰之后,将数加起来平均一下就可以得出答案。考虑一个人,如果选了他,那么C(n,k)中有多少种情况会导致选这个人呢?假设这个人的前面有cnt个人,也就是只要选了这cnt个人的其中一个的话,那么就会选到这个人,然后共有C(n,k)- C(n - cnt, k)种是会选到这cnt个人的,所以考虑每个点dfs一次算出cnt就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*zhen hao*/
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 #include <algorithm>
6 using namespace std;
7
8 typedef long long ll;
9 const int maxn = 55, maxm = 1e5 + 10;
10 int n, m, k, tot;
11 int head[maxn], cnt[maxn];
12 ll c[maxn][maxn];
13 bool vis[maxn];
14
15 struct Edge {
16 int v, next;
17 Edge(int v=0, int next=0) : v(v), next(next) {}
18 } edges[maxm];
19
20 void init() {
21 c[0][0] = 1;
22 for (int i = 1; i < maxn; i++) {
23 c[i][0] = c[i - 1][0];
24 for (int j = 1; j <= i; j++)
25 c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
26 }
27
28 memset(head, -1, sizeof head);
29 tot = 0;
30 }
31
32 void add_edge(int u, int v) {
33 edges[tot] = Edge(v, head[u]);
34 head[u] = tot++;
35 }
36
37 void dfs(int u) {
38 vis[u] = 1;
39 for (int i = head[u]; ~i; i = edges[i].next) {
40 int v = edges[i].v;
41 if (!vis[v]) dfs(v);
42 }
43 }
44
45 int main() {
46 // freopen("case.in", "r", stdin);
47 int T;
48 cin >> T;
49 while (T--) {
50 scanf("%d%d%d", &n, &m, &k);
51 init();
52 for (int i = 0; i < m; i++) {
53 int u, v;
54 scanf("%d%d", &u, &v);
55 add_edge(v, u);
56 }
57 for (int i = 1; i <= n; i++) {
58 memset(vis, false, sizeof vis);
59 dfs(i);
60 cnt[i] = 0;
61 for (int j = 1; j <= n; j++) cnt[i] += vis[j];
62 }
63 ll ans = 0;
64 for (int i = 1; i <= n; i++) {
65 ans += c[n][k] - c[n - cnt[i]][k];
66 }
67 cout << ans << endl;
68 }
69 return 0;
70 }
题B 18113 Secret Book of Kungfu
题意:定义一种数,该数的十进制表示是它的二进制表示的子串,求l,r中有多少个数满足?
题解:打表发现这种数只可能是0和1组成,那么对于这个区间的所有0和1组成的十进制数,暴力统计一下有多少个,打个表二分查找即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*zhen hao*/
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 #include <iostream>
6 #include <cmath>
7 #include <vector>
8 #include <queue>
9 #include <stack>
10 #include <string>
11 using namespace std;
12
13 typedef long long ll;
14 const ll inf = 1e15;
15 char s[100], t[100];
16 int dp[1 << 20], digit[100], cnt;
17 ll id[1 << 20];
18
19 int check(int l, int r) {
20 int ret = 0;
21 for (int i = l; i <= r; i++) {
22 int ss = 0, st = 0;
23 int x = i;
24 while (x) {
25 s[ss++] = (x % 2) + '0';
26 x /= 2;
27 }
28 s[ss] = '