比赛链接:Here

AB水题,

C - : (Colon)

时针转过得角度为:AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图1

分针转过得角度为:AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图2

  1. const double pi = acos(-1.0);
  2. int main() {
  3. double a, b, h, m;
  4. cin >> a >> b >> h >> m;
  5. long double rad = pi * 2 * ((long double)h / 12.0 + ((long double)m / 60.0) / 12.0 - (long double)m / 60.0);
  6. long double rsq = (long double)(a * a + b * b) - (long double)(2 * a * b) * cosl(rad);
  7. printf("%20.20Lf\n", sqrtl(rsq));
  8. return 0;
  9. }

D - .. (Double Dots)

AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图3个点 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图4 条边的图,让你在每个点指明一个方向(就是下一个点),使得从每个点出发,沿着点的指定方向走最终能到达点 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图5

如果可以,输出 yes ,并且给出每个点指明的方向,否则输出 no

直接反着考虑,从点 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图6 出发的 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图7

  1. const int N = 1e5 + 10;
  2. vector<ll>e[N];
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. int n, m; cin >> n >> m;
  6. for (int i = 0, u, v; i < m; ++i) {
  7. cin >> u >> v, u--, v--;
  8. e[u].push_back(v);
  9. e[v].push_back(u);
  10. }
  11. vector<ll>dis(n, -1);
  12. queue<ll>q;
  13. q.push(0), dis[0] = 0;
  14. while (!q.empty()) {
  15. int u = q.front(); q.pop();
  16. for (int v : e[u]) {
  17. if (dis[v] == -1) dis[v] = u, q.push(v);
  18. }
  19. }
  20. cout << "Yes\n";
  21. for (int i = 1; i < n; ++i) cout << dis[i] + 1 << "\n";
  22. }

E - ∙ (Bullet)

小兔捕获了 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图8 条不同的沙丁鱼,第 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图9 条沙丁鱼的 美味程度香味程度 分别是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图10AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图11
她想在这些沙丁鱼中选择 一条 或者 多条 放入冷冻箱;但是必须保证沙丁鱼的选择是合格的

合格的定义:其中的任意两条沙丁鱼 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图12AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图13 都不满足 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图14

小兔想知道有多少种选择沙丁鱼的方法(选择的沙丁鱼的集合相同,算同一种方法),答案对 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图15 取模

简化题意:

AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图16 个点,每个点给出 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图17

在一个集合中,不难存在满足 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图18 的点对

现在问能选出多少这样的集合,注意对 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图19 取模

数据范围

  • AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图20
  • AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图21

AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图22


需要不满足的式子与 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图23AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图24 的关系太大了,不妨化简一下:

AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图25

所以可能有很多点 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图26 相等,把他们染成相同的颜色

然后不能和他们同时出现的颜色就是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图27 ,找出他们即可

但是注意,这里等式转换的前提是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图28

所以有四种情况:

  1. AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图29
  2. AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图30
  3. AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图31
  4. AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图32

其中,
①和其他三种都不能在一个集合
②和③不能在一个集合
④中某些点不能在一个集合
那么我们直接染色找即可
还有一个问题

就是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图33 是一个小数,如果我们用 map 来存有可能精度不够,所以将 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图34 转化为分数 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图35 的三元组 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图36#card=math&code=%28a%2C%20b%2C%20c%29) 来记录,还要考虑一下符号,所以用两个 map

最后我们都找到了后,要考虑计算答案
对于一种颜色来说,假如它有 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图37 各点

每个点选和不选两种情况,总的就是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图38 种情况,再减去全都不选的情况,所以最终这个颜色的选法就是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图39

然后假如不能和他同时选的另一种颜色是 AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图40

那么就是三种情况

  • AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图41
  • AtCoder Beginner Contest 168 (A~E,E题很有意思) - 图42
  • 都不选

这样考虑即可

  1. typedef pair<int, int> pii;
  2. typedef pair<int, pii> piii;
  3. const int MAX = 2e5 + 10;
  4. const ll mod = 1000000007;
  5. int N;
  6. ll siz[MAX], rhs[MAX], col, vis[MAX];
  7. ll f[MAX], num1, num2;
  8. map<piii, int> mp[2];
  9. inline piii calc(ll x, ll y) {
  10. x = abs(x), y = abs(y);
  11. ll gcd = __gcd(x % y, y);
  12. return piii{x / y, {x % y / gcd, y / gcd}};
  13. }
  14. int main() {
  15. scanf("%d", &N);
  16. f[0] = 1;
  17. for (int i = 1; i <= N; i++) f[i] = 1ll * f[i - 1] * 2 % mod;
  18. for (int i = 0; i <= N; i++) f[i] = (f[i] - 1 + mod) % mod;
  19. ll ans = 0;
  20. for (int i = 1; i <= N; i++) {
  21. ll a, b; scanf("%lld%lld", &a, &b);
  22. if (a == 0 && b == 0) ans++;//a=0,b=0,只能选和不选
  23. else if (a == 0) num1++;
  24. else if (b == 0) num2++;
  25. else {
  26. piii now = calc(a, b), pre = calc(b, a);//转化为三元组
  27. int state = 0;//判断符号
  28. if (1.0 * a / b > 0) state = 1;
  29. if (!mp[state].count(now)) {
  30. mp[state][now] = ++col;
  31. if (mp[state ^ 1].count(pre))
  32. rhs[col] = mp[state ^ 1][pre], rhs[mp[state ^ 1][pre]] = col;
  33. }
  34. siz[mp[state][now]]++;
  35. }
  36. }
  37. ll t = (f[num1] + f[num2] + 1) % mod;//a = 0, b != 0 和 a!=0, b = 0
  38. for (int i = 1; i <= col; i++)
  39. if (!vis[i]) {
  40. vis[i] = 1;
  41. if (rhs[i]) {
  42. vis[rhs[i]] = 1;
  43. t = t * ((1ll + (f[siz[i]] + f[siz[rhs[i]]]) % mod) % mod) % mod;
  44. }
  45. else t = t * ((1ll + f[siz[i]]) % mod) % mod;
  46. }
  47. ans = (ans + t) % mod;
  48. printf("%lld\n", (ans - 1 + mod) % mod);
  49. }

写法改进

  1. const int mod = 1e9 + 7;
  2. ll qpow(ll a, ll b) {
  3. ll ans = 1;
  4. for (; b; b >>= 1, a = a * a % mod) if (b & 1) ans = ans * a % mod;
  5. return ans;
  6. }
  7. int main() {
  8. cin.tie(nullptr)->sync_with_stdio(false);
  9. ll n; cin >> n;
  10. map<pair<ll, ll>, pair<ll, ll>> m;
  11. ll ans = 1, P = mod - 1;
  12. for (int i = 0; i < n; ++i) {
  13. ll a, b;
  14. cin >> a >> b;
  15. if (!a && !b) P += 1;
  16. else {
  17. ll g = __gcd(a, b);
  18. a /= g, b /= g;
  19. if (b < 0) a = -a, b = -b;
  20. if (a <= 0) m[ {b, -a}].second++;
  21. else m[ {a, b}].first ++;
  22. }
  23. }
  24. for (auto u : m) ans = ans * (qpow(2, u.second.first) + qpow(2, u.second.second) - 1 + mod) % mod;
  25. cout << (ans + P) % mod;
  26. }