题解 AtCoder Beginner Contest 168
小兔的话
欢迎大家在评论区留言哦~
A - ∴ (Therefore)
B - ... (Triple Dots)
C - : (Colon)
D - .. (Double Dots)
E - ∙ (Bullet)
简单题意
小兔捕获了 \(N\) 条不同的沙丁鱼,第 \(i\) 条沙丁鱼的 美味程度 和 香味程度 分别是 \(A_i\) 和 \(B_i\)
她想在这些沙丁鱼中选择 一条 或者 多条 放入冷冻箱;但是必须保证沙丁鱼的选择是合格的
(合格的定义:其中的任意两条沙丁鱼 \(i\) 和 \(j\) 都不满足 \(A_i \times A_j + B_i \times B_j = 0\))
小兔想知道有多少种选择沙丁鱼的方法(选择的沙丁鱼的集合相同,算同一种方法),答案对 \(1e9 +7\) 取模
数据范围
\(1 \leq N \leq 2 \times 10^5\)
\(-10^{18} \leq A_i, B_i \leq 10^{18}\)
知识点
- 数学知识
- 最大公约数 \(\mathrm{gcd}\)
 - 快速幂
 
 - STL
mappair
 
分析
需要不满足的式子与 \(i\) 和 \(j\) 的关系太大了,不妨化简一下:
\]
我们可以把 \(\frac{A_i}{B_i}\) 相同的分成一组,统计出属于这一组的沙丁鱼的数量,再把 \(\frac{A_i}{B_i}\) 和 \(- \frac{B_j}{A_j}\) 的两组分成一对,这一对肯定是互相满足的(就是 \(C\) 与 \(D\) 是一对,反过来 \(D\) 肯定与 \(C\) 是一对,\(D\) 不会和其它成为一对)
我们计算每一对里的选择方案,把所有的选择方案数乘起来再 减一(排除全部不选的情况),就是最终的答案了
如何计算每一对里的选择方案呢?
可以先计算每一对中每组的选择方案,设属于这一组的沙丁鱼有 \(s\) 条,选择沙丁鱼的方案数就是 \(2^s\)(每条鱼有 被选择 和 不被选择 \(2\) 种情况)
那么每一对的方案数就是 \(s_1 + s_2 - 1\)
- 因为其中的两组是不能同时选的,所以是 \(+\) 而不是 \(\times\)
 - 因为在统计 \(s_1\) 被选的时候,\(s_2\) 一定是不选的;同理,在统计 \(s_2\) 被选的时候,\(s_1\) 一定是不选的;需要减去这 \(2\) 种多算的情况;又因为 \(2\) 组都不选也是 \(1\) 种合格的情况,所以又要加上 \(1\) 种情况,所以是 \(+1\)
 
代码
#include <cstdio>
#include <map>
#include <utility>
using namespace std;
#define int long long
int Gcd(int u, int v) { return (v == 0) ? u : Gcd(v, u % v); }
int Max(int u, int v) { return (u > v) ? u : v; }
int Min(int u, int v) { return (u < v) ? u : v; }
int rint()
{
    int x = 0, fx = 1; char c = getchar();
    while (c < '0' || c > '9') { fx ^= ((c == '-') ? 1 : 0); c = getchar(); }
    while ('0' <= c && c <= '9') { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); }
    if (!fx) return -x;
    return x;
}
int qpow(int u, int v, int Mod)
{
	int ans = 1; u %= Mod;
	while (v)
	{
		if (v & 1) ans = ans * u % Mod;
		u = u * u % Mod; v >>= 1;
	}
	return ans;
}
const int MOD = 1e9 + 7;
const int MAX_n = 2e5;
int n, ans = 1, sum = 0;
int A[MAX_n + 5];
int B[MAX_n + 5];
map<pair<int, int>, int> G;
map<pair<int, int>, bool> vis;
signed main()
{
	n = rint();
	for (int i = 1; i <= n; i++)
	{
		A[i] = rint(), B[i] = rint();
		if (A[i] == 0 && B[i] == 0)
		{
			++sum; --i; --n; continue;
		}
		int temp = Gcd(A[i], B[i]);
		A[i] /= temp; B[i] /= temp;
		if (A[i] < 0) { A[i] = -A[i]; B[i] = -B[i]; }
		++G[make_pair(A[i], B[i])];
	}
	for (int i = 1; i <= n; i++)
	{
		pair<int, int> now = make_pair(A[i], B[i]);
		if (-B[i] < 0)  { B[i] = -B[i]; A[i] = -A[i]; }
		pair<int, int> other = make_pair(-B[i], A[i]);
		if (vis[now] || vis[other]) continue;
		vis[now] = vis[other] = true;
		ans = ans * ((qpow(2, G[now], MOD) + qpow(2, G[other], MOD) - 1) % MOD) % MOD;
	}
	printf("%lld\n", (ans - 1 + sum + MOD) % MOD);
	return 0;
}
F - . (Single Dot)
题解 AtCoder Beginner Contest 168的更多相关文章
- AtCoder Beginner Contest 168
		
比赛链接:https://atcoder.jp/contests/abc168/tasks A - ∴ (Therefore) 题意 给出一个由数字组成的字符串 $s$,要求如下: 如果 $s$ 以 ...
 - Atcoder Beginner Contest  168 D - .. (Double Dots) (BFS)
		
题意:有\(n\)个房间,在这些房间中两两连\(m\)次条边,问除了第一个房间,其他房间走到第一个房间的最短路径,输出这个房间所连的上一个房间,如果走不到,输出\(no\). 题解:刚开始我写了一个d ...
 - [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
		
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
 - [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT
		
题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...
 - AtCoder Beginner Contest 154 题解
		
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
 - AtCoder Beginner Contest 153 题解
		
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
 - AtCoder Beginner Contest 177 题解
		
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
 - KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
		
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
 - AtCoder Beginner Contest 184 题解
		
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
 
随机推荐
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
			
美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...
 - Java中单列集合List排序的真实应用场景
			
一.需求描述 最近产品应客户要求提出了一个新的需求,有一个列表查询需要按照其中的多列进行排序. 二.需求分析 由于数据总量不多,可以全部查询出来,因此我就考虑使用集合工具类Collections.so ...
 - Django(43)restful接口规范
			
restful接口规范 什么是接口规范?接口规范就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据.如何写接口:接口规范是规范化书写接口的,写接口要写url.响应数据  注:如果将 ...
 - [leetcode] 37. 解数独(Java)(dfs,递归,回溯)
			
37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...
 - GO学习-(29) Go语言操作etcd
			
Go语言操作etcd etcd是近几年比较火热的一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现,本文主要介绍etcd的安装和使用. etcd etcd介绍 etcd是使用Go语 ...
 - Jmeter- 笔记5 - 从响应数据提取信息
			
JSON提取器 提取 响应体(response body)里的信息 在需要提取数据的请求下添加 JSON提取器,一个JSON提取器可以写多个json提取器 路径:后置处理器 -> JSON提取器 ...
 - Linux实现ffmpeg H.265视频编码
			
Linux实现ffmpeg H.265视频编码 几乎所有观看的视频,数字地面电视,电缆,卫星或互联网上的压缩.原始的,未压缩的视频太大,会浪费太多的带宽.在DVD和Blu-ray之前,有视频CD(VC ...
 - 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络
			
英特尔 至强 平台集成 AI 加速构建数据中心智慧网络 SNA 通过 AI 方法来实时感知网络状态,基于网络数据分析来实现自动化部署和风险预测,从而让企业网络能更智能.更高效地为最终用户业务提供支撑. ...
 - Spring4
			
Spring javaEE开发一站式框架 web层:SpringMVC Service层:Spring的Bean管理(IoC).Spring声明式事务 Dao层:Spring的jdbc模板.Sprin ...
 - Linux关闭打开防火墙命令
			
Linux下打开和关闭防火墙 1.及时生效,重启后复原 关闭:service iptables stop 开启:service iptalbes start 查看状态:service iptabl ...