Peekaboo(2019年上海网络赛K题+圆上整点)
题目链接
题意
你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=OA,b=OB,c=AB\),问你有多少对满足题意的\(A,B\)。
思路
由于\(a,b,c\)都是整数,\(O,A,B\)的坐标为整数,所以如果存在满足题意的点对,那么\(a,b\)一定是勾股数,且\(a^2=x_1^2+y_1^2,b=x_2^2+y_2^2\),所以我们可以通过求出所有的\((x_1,y_1),(x_2,y_2)\)然后看\(c\)是否等于\(AB\)。
对于\(a^2=x^2+y^2\),此时要推荐一个优秀的视频,根据这个视频里面说的即可解决这题。
如果没有时间看那么长的视频的可以看洛谷圆上整点的板题的题解里面的解释。
代码
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define fi first
#define se second
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("D://Code//in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1000000007;
const int maxn = 1000000 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int t, cnt;
LL a, b, c;
pair<pii,pii> vec[maxn];
vector<pii> A, B;
bool check(LL x1, LL y1, LL x2, LL y2) {
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) == c * c;
}
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
void solve(LL x, LL d, vector<pii> &vec) {
if(x == 1 || x % 4 != 1) return;
for(int s = 1; 2LL * s * s <= x; ++s) {
LL tmp = x - 1LL * s * s;
int t = (int)sqrt(tmp);
if(1LL * t * t != tmp) ++t;
if(1LL * s * s + 1LL * t * t != x) continue;
if(gcd(s, t) != 1) continue;
if(s >= t) continue;
vec.emplace_back((1LL * t * t - 1LL * s * s) * d, 2 * d * s * t);
}
}
void GaussInteger(LL x, vector<pii> &vec) {
for(int i = 1; 1LL * i * i <= x; ++i) {
if(x % i) continue;
solve(x / i, i, vec);
if(1LL * i * i != x) solve(i, x / i, vec);
}
}
void fillpoint(LL x, vector<pii> &vec) {
int num = vec.size();
for(int i = 0; i < num; ++i) {
vec.emplace_back(vec[i].se, vec[i].fi);
}
for(int i = 0; i < 2 * num; ++i) {
vec.emplace_back(vec[i].fi, -vec[i].se);
vec.emplace_back(-vec[i].fi, vec[i].se);
vec.emplace_back(-vec[i].fi, -vec[i].se);
}
vec.emplace_back(x, 0);
vec.emplace_back(-x, 0);
vec.emplace_back(0, x);
vec.emplace_back(0, -x);
}
int main() {
#ifndef ONLINE_JUDGE
FIN;
time_t startclock = clock();
#endif // ONLINE_JUDGE
scanf("%d", &t);
while(t--) {
scanf("%lld%lld%lld", &a, &b, &c);
cnt = 0;
A.clear(), B.clear();
GaussInteger(a, A), GaussInteger(b, B);
fillpoint(a, A), fillpoint(b, B);
for(auto num1:A) {
for(auto num2:B) {
if(check(num1.fi, num1.se, num2.fi, num2.se)) {
vec[++cnt] = make_pair(num1, num2);
}
}
}
sort(vec + 1, vec + cnt + 1);
printf("%d\n", cnt);
for(int i = 1; i <= cnt; ++i) {
printf("%d %d %d %d\n", vec[i].fi.fi, vec[i].fi.se, vec[i].se.fi, vec[i].se.se);
}
}
#ifndef ONLINE_JUDGE
time_t endclock = clock();
printf("It costs %.3fs\n", 1.0 * (endclock - startclock) / CLOCKS_PER_SEC);
#endif // ONLINE_JUDGE
return 0;
}
Peekaboo(2019年上海网络赛K题+圆上整点)的更多相关文章
- 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...
- Magic Master(2019年南昌网络赛E题+约瑟夫环)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...
- 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...
- 2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手. 其实了解差分思想的一眼就能看出来是差分了.但是如果对n差分的话很明 ...
- [2019上海网络赛F题]Rhyme scheme
题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
You are given a point set with nn points on the 2D-plane, your task is to find the smallest number o ...
- [2019上海网络赛J题]Stone game
题目链接 CSLnb! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...
- 2019 ACM-ICPC 上海网络赛 B. Light bulbs (差分)
题目链接:Light bulbs 比赛链接:The Preliminary Contest for ICPC Asia Shanghai 2019 题意 给定 \(N\) 个灯泡 (编号从 \(0\) ...
- 2019 ICPC南昌网络赛 B题
英雄灭火问题忽略了一点丫 一个超级源点的事情,需要考虑周全丫 2 #include<cstdio> #include<cstring> #include<queue> ...
随机推荐
- 【day03】php
一.类型判别函数库 1.安装:类型判别函数库是PHPCORE的组成部分,不用安装 2. (1)is_integer|is_int|is_long 描述: 检测变量是否是整数 格式: ...
- Linux性能优化实战学习笔记:第十六讲
一.free数据的来源 1.碰到看不明白的指标时该怎么办吗? 不懂就去查手册.用 man 命令查询 free 的文档.就可以找到对应指标的详细说明.比如,我们执行 man fre... 2.free数 ...
- 【领会要领】web前端-轻量级框架应用(jQuery基础)
作者 | Jeskson 来源 | 达达前端小酒馆 jquery的安装和语法,jquery的多种选择器,dom操作和jquery事件. jQuery框架,简介,优势,安装,语法,jQuery选择器,i ...
- [转载]3.15 UiPath图片操作保存图片的介绍和使用
一.保存图像 (Save Image)的介绍 可以将图像保存到磁盘的一种活动 二.保存图像 (Save Image)在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列命 ...
- Azure DevOps Server 经验分享(国内重型工程公司)
受邀在上海为国内著名的重型工程公司的软件研发团队分享了Azure DevOps Server 的经验. http://www.cnblogs.com/danzhang/ DevOps MVP 张洪君 ...
- c# 多线程解决死锁问题
可使用:Monitor.TryEnter()方法.虽然这种方法可以解决死锁问题,但是最好还是不要出现死锁这种情况.如果出现死锁这种情况,就说明代码有问题啊.还是在else里面加个日志记录下吧,然后再解 ...
- Nodejs操作MySQL数据库
https://github.com/mysqljs/mysql 如何用nodejs操作MySql数据呢,其实写法还是简单的, 1.开始在你的node项目中 npm install mysql - ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- HTTP之缓存处理步骤
缓存的处理步骤 =================摘自<HTTP权威指南>===================== 现代的商业化代理缓存相当的复杂.这些缓存构建的非常有效,可以支持HTT ...
- Composer 入门后,接下来该看看这篇文章了
上篇文章,我们了解了 Composer 的包是如何开发的,过程中我们使用了 composer init. composer install. composerrequire. composer con ...