AtCoder Beginner Contest 168 (A~E,E题很有意思)
比赛链接:Here
AB水题,
C - : (Colon)
时针转过得角度为:\(2π \times \frac{h + \frac m{12}}{12}\)
分针转过得角度为:\(2π \times \frac{m}{60}\)
const double pi = acos(-1.0);
int main() {
double a, b, h, m;
cin >> a >> b >> h >> m;
long double rad = pi * 2 * ((long double)h / 12.0 + ((long double)m / 60.0) / 12.0 - (long double)m / 60.0);
long double rsq = (long double)(a * a + b * b) - (long double)(2 * a * b) * cosl(rad);
printf("%20.20Lf\n", sqrtl(rsq));
return 0;
}
D - .. (Double Dots)
\(N\)个点 \(M\) 条边的图,让你在每个点指明一个方向(就是下一个点),使得从每个点出发,沿着点的指定方向走最终能到达点 \(1\)
如果可以,输出 yes ,并且给出每个点指明的方向,否则输出 no
直接反着考虑,从点 \(1\) 出发的 \(BFS\)
const int N = 1e5 + 10;
vector<ll>e[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m; cin >> n >> m;
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v, u--, v--;
e[u].push_back(v);
e[v].push_back(u);
}
vector<ll>dis(n, -1);
queue<ll>q;
q.push(0), dis[0] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : e[u]) {
if (dis[v] == -1) dis[v] = u, q.push(v);
}
}
cout << "Yes\n";
for (int i = 1; i < n; ++i) cout << dis[i] + 1 << "\n";
}
E - ∙ (Bullet)
小兔捕获了 \(N\) 条不同的沙丁鱼,第 \(i\) 条沙丁鱼的 美味程度 和 香味程度 分别是 \(A_i\) 和 \(B_i\)
她想在这些沙丁鱼中选择 一条 或者 多条 放入冷冻箱;但是必须保证沙丁鱼的选择是合格的
合格的定义:其中的任意两条沙丁鱼 \(i\) 和 \(j\) 都不满足 \(A_i×A_j+B_i×B_j=0\)
小兔想知道有多少种选择沙丁鱼的方法(选择的沙丁鱼的集合相同,算同一种方法),答案对 \(1e9+7\) 取模
简化题意:
\(N\) 个点,每个点给出 \(A_i,B_i\)
在一个集合中,不难存在满足 \(A_iB_j + A_jB_i = 0\) 的点对
现在问能选出多少这样的集合,注意对 \(1e9 + 7\) 取模
数据范围
- \(1\le N\le 2e5\)
- \(-10^{18}\le A_i,B_i\le 10^{18}\)
\]
需要不满足的式子与 \(i\) 和 \(j\) 的关系太大了,不妨化简一下:
\(A_i×A_j+B_i×B_j=0 \to A_i\times A_j = -B_i\times B_j \to \frac{A_i}{B_i}=-\frac{B_j}{A_j}\)
所以可能有很多点 \(\frac{A_i}{B_i}\) 相等,把他们染成相同的颜色
然后不能和他们同时出现的颜色就是 \(-\frac{B_j}{A_j}\) ,找出他们即可
但是注意,这里等式转换的前提是 \(A_i \not =0,B_i\not =0\)
所以有四种情况:
- \(A_i = 0,B_i =0\)
- \(A_i \not =0,B_i =0\)
- \(A_i=0,B_i\not =0\)
- \(A_i \not =0,B_i\not =0\)
其中,
①和其他三种都不能在一个集合
②和③不能在一个集合
④中某些点不能在一个集合
那么我们直接染色找即可
还有一个问题
就是 \(\frac{A_i}{B_i}\) 是一个小数,如果我们用 map 来存有可能精度不够,所以将 \(\frac{A_i}{B_i}\) 转化为分数 \(a\frac bc\) 的三元组 \((a, b, c)\) 来记录,还要考虑一下符号,所以用两个 map
最后我们都找到了后,要考虑计算答案
对于一种颜色来说,假如它有 \(Siz\) 各点
每个点选和不选两种情况,总的就是 \(2^{Siz}\) 种情况,再减去全都不选的情况,所以最终这个颜色的选法就是 \(2^{Siz} - 1\)
然后假如不能和他同时选的另一种颜色是 \(rhs[color]\)
那么就是三种情况
- 选 \(color\)
- 选 \(rhs[color]\)
- 都不选
这样考虑即可
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
const int MAX = 2e5 + 10;
const ll mod = 1000000007;
int N;
ll siz[MAX], rhs[MAX], col, vis[MAX];
ll f[MAX], num1, num2;
map<piii, int> mp[2];
inline piii calc(ll x, ll y) {
x = abs(x), y = abs(y);
ll gcd = __gcd(x % y, y);
return piii{x / y, {x % y / gcd, y / gcd}};
}
int main() {
scanf("%d", &N);
f[0] = 1;
for (int i = 1; i <= N; i++) f[i] = 1ll * f[i - 1] * 2 % mod;
for (int i = 0; i <= N; i++) f[i] = (f[i] - 1 + mod) % mod;
ll ans = 0;
for (int i = 1; i <= N; i++) {
ll a, b; scanf("%lld%lld", &a, &b);
if (a == 0 && b == 0) ans++;//a=0,b=0,只能选和不选
else if (a == 0) num1++;
else if (b == 0) num2++;
else {
piii now = calc(a, b), pre = calc(b, a);//转化为三元组
int state = 0;//判断符号
if (1.0 * a / b > 0) state = 1;
if (!mp[state].count(now)) {
mp[state][now] = ++col;
if (mp[state ^ 1].count(pre))
rhs[col] = mp[state ^ 1][pre], rhs[mp[state ^ 1][pre]] = col;
}
siz[mp[state][now]]++;
}
}
ll t = (f[num1] + f[num2] + 1) % mod;//a = 0, b != 0 和 a!=0, b = 0
for (int i = 1; i <= col; i++)
if (!vis[i]) {
vis[i] = 1;
if (rhs[i]) {
vis[rhs[i]] = 1;
t = t * ((1ll + (f[siz[i]] + f[siz[rhs[i]]]) % mod) % mod) % mod;
}
else t = t * ((1ll + f[siz[i]]) % mod) % mod;
}
ans = (ans + t) % mod;
printf("%lld\n", (ans - 1 + mod) % mod);
}
写法改进
const int mod = 1e9 + 7;
ll qpow(ll a, ll b) {
ll ans = 1;
for (; b; b >>= 1, a = a * a % mod) if (b & 1) ans = ans * a % mod;
return ans;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
ll n; cin >> n;
map<pair<ll, ll>, pair<ll, ll>> m;
ll ans = 1, P = mod - 1;
for (int i = 0; i < n; ++i) {
ll a, b;
cin >> a >> b;
if (!a && !b) P += 1;
else {
ll g = __gcd(a, b);
a /= g, b /= g;
if (b < 0) a = -a, b = -b;
if (a <= 0) m[ {b, -a}].second++;
else m[ {a, b}].first ++;
}
}
for (auto u : m) ans = ans * (qpow(2, u.second.first) + qpow(2, u.second.second) - 1 + mod) % mod;
cout << (ans + P) % mod;
}
AtCoder Beginner Contest 168 (A~E,E题很有意思)的更多相关文章
- 题解 AtCoder Beginner Contest 168
小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...
- AtCoder Beginner Contest 168
比赛链接:https://atcoder.jp/contests/abc168/tasks A - ∴ (Therefore) 题意 给出一个由数字组成的字符串 $s$,要求如下: 如果 $s$ 以 ...
- AtCoder Beginner Contest 188 F - +1-1x2 思维题
题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...
- Atcoder Beginner Contest 168 D - .. (Double Dots) (BFS)
题意:有\(n\)个房间,在这些房间中两两连\(m\)次条边,问除了第一个房间,其他房间走到第一个房间的最短路径,输出这个房间所连的上一个房间,如果走不到,输出\(no\). 题解:刚开始我写了一个d ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
- AtCoder Beginner Contest 224
AtCoder Beginner Contest 224 A - Tires 思路分析: 判断最后一个字符即可. 代码如下: #include <bits/stdc++.h> using ...
- AtCoder Beginner Contest 223
AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B - String Shifting 思路分析 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也 ...
随机推荐
- Leetcode回文数
直接上python代码 class Solution: def isPalindrome(self, x: int) -> bool: if x<0: //负数必不是回文数 return ...
- 平台工程时代的 Kubernetes 揭秘:2023年生产状况报告深度剖析
Kubernetes 在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战.八年过去了,在生产环境中使用 ...
- SQL 语言标准简介
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 一.简介 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是 ...
- 使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
版本 Linux 6.5 背景 在学习cgroupv2的时候,想给子cgroup开启cpu控制器结果失败了: # 查看可以开启哪些控制器 root@ubuntu-vm:/sys/fs/cgroup# ...
- python3使用pandas备份mysql数据表
操作系统 :CentOS 7.6_x64 Python版本:3.9.12 MySQL版本:5.7.38 日常开发过程中,会遇到mysql数据表的备份需求,需要针对单独的数据表进行备份并定时清理数据. ...
- jdk21的外部函数和内存API(MemorySegment)(官方翻译)
1.jdk21: 引入一个 API,通过该 API,Java 程序可以与 Java 运行时之外的代码和数据进行互操作.通过有效地调用外部函数(即JVM外部的代码)和安全地访问外部内存(即不由JVM ...
- catcat-new【目录穿透+特殊文件】
catcat-new[目录穿透+特殊文件] 题目界面 点击任何一只猫猫,发现路径泄露: 解题步骤 测试目录遍历漏洞 路径: ?file=../../../../etc/passwd 成功读取到pass ...
- React Hook 之 Effect :同步与外部系统的数据
有时组件中的数据需要与外部系统的数据或操作同步,React提供了Hook Effect. Effect 会在组件渲染后运行一些代码,以便将组件与 React 之外的某些系统同步,包比如浏览器 API. ...
- MySQL 事务的基础知识
事务的基础知识 1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库中的数据始终保持 一致性,同时我们还能通过事务的机制 恢复到某个时间地点的数据,这样可以保证已 ...
- 使用RFC跳过权限校验的方法
1.业务背景 由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题.例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用 ...