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> ...
随机推荐
- day 25
Nothing is more dangerous than discontinued labor. 没有什么比半途而废更危险.
- [LeetCode] 415. Add Strings 字符串相加
Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址
摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...
- Elasticsearch由浅入深(三)document的核心元数据、Id、_source元数据、全量替换、强制创建以及删除机制
document的核心元数据 document的核心元数据有三个:_index._type._id 初始化数据: PUT test_index/test_type/ { "test_cont ...
- 分布式数据库缓存系统Apache Ignite
Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. 将数据存储在缓存中能够 ...
- 【插件】【idea】JRebel mybatisPlus extension是JRebel热部署插件的扩展支持mybatis的xml文件热部署
和JRebel一起使用,修改mybatis的mapper.xml文件不用重启项目 File->Settings->Plugs
- vue + element 文件上传 并将文件转 base64
当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...
- Java8 新特性 Steam() 中间有状态操作
中间有状态操作 Java8 新特性 Stream 练习实例 中间操作,就是把数据处理成自己想要的类型,并且有状态操作,是在所有的数据基础上进行操作的.比如dictinct(去重),sorted(排 ...
- [转载]DevExpress GridControl 使用方法技巧 总结 收录整理
最近开始用DevExpress组件,发现很好的经验总结博客,在这里转载分享 原作者:https://www.cnblogs.com/wordgao/p/4517011.html 一.如何解决单击记录整 ...