#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 2e5 + 10; constint INF = 0x3f3f3f3f; int n, m; int a[N]; int vis[N]; vector<int>vc; intmain(){ scanf("%d%d", &n, &m); bool flg = 0; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); if (vis[a[i]%m])flg = 1; vis[a[i]%m] = 1; vc.push_back(a[i]); } if (flg) { puts("0"); return0; } ll ans = 1; n = (int)vc.size(); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { ans = (ans*abs(vc[j] - vc[i])) % m; } } cout << ans << endl; return0; }
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 2e5 + 10; constint INF = 0x3f3f3f3f; int n; int to[N], nx[N], st[N], tot, d[N]; inlinevoidadd(int u, int v){ to[++tot] = v, nx[tot] = st[u], st[u] = tot; } voiddfs2(int u, int _fa){ d[u] = -1; for (int i = st[u]; i; i = nx[i]) { if (to[i] == _fa || d[to[i]] == -1)continue; dfs2(to[i], u); } } booldfs(int s, int t, int u, int _fa){ bool flg = 0; if (u == t)flg = 1; if (!flg) { for (int i = st[u]; i; i = nx[i]) { if (to[i] == _fa || d[to[i]] == -1)continue; if (dfs(s, t, to[i], u)) { flg = 1; } } } if (flg&&u != s)dfs2(u, _fa); return flg; } intmain(){ cin >> n; for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); d[u]++; add(v, u); d[v]++; } while (1) { int u = -1, v = -1, lca; for (int i = 1; i <= n; i++)if (d[i] == 1) { u = i; break; } for (int i = n; i >= 1; i--)if (d[i] == 1) { v = i; break; } if (u == -1) { for (int i = 1; i <= n; i++)if (d[i] == 0) { cout << "! " << i << endl; return0; } } cout << "? " << u << ' ' << v << endl; cin >> lca; dfs(lca, u, lca, 0); dfs(lca, v, lca, 0); d[lca] -= 2; d[lca] += (u == lca || v == lca); } return0; }
E. Kuroni and the Score Distribution
题意:要求构造一个长度为 n 的严格递增序列,且满足 1≤i<j<k≤n,ai+aj=ak 的 (i,j,k) 个数恰好为 m 。
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 2e5 + 10; constint INF = 0x3f3f3f3f; int n, m; ll p[N]; voidpre(){ for (int n = 2; n <= 5001; n++) { for (int i = 1; i + i + 1 <= n; i++)p[n] += n - 2 * i; } } intcal(int k,int n){ int ans = (k - 1) / 2 + max(n - 2 * k, 0) + min(n - k, k - 1); return ans; } int ans[N]; intmain(){ pre(); cin >> n >> m; if (m >= p[n]) { if (m > p[n])puts("-1"); elsefor (int i = 1; i <= n; i++)printf("%d%s", i, i == n ? "\n" : " "); } else { int k = lower_bound(p + 1, p + n + 1, m) - p; if (p[k] != m) { int t; for (t = 1; t <= k && cal(t, k + 1) != p[k + 1] - m; t++); for (int i = 1, cnt = 0; i <= k + 1; i++)if (i != t)ans[++cnt] = i; } elsefor (int i = 1; i <= k; i++)ans[i] = i; int t = 1000000000; for (int i = n; i > k; i--) { ans[i] = t; t -= (ans[k] + 1); if (i<n&&ans[i] + ans[i + 1] <= 1e9) { puts("-1"); return0; } } for (int i = 1; i <= n; i++)printf("%d%s", ans[i], i == n ? "\n" : " "); } return0; }