【XR-4】题
题面
题解
由题,所求为方程\(y^2 = x^2 + ax + b\)的整数解数量。
两边同乘\(4\),可得\((2y)^2 = 4x^2 + 4ax + 4b\)。
配方后得\((2y)^2 = (2x + a)^2 + 4b - a^2\)。
移项得\((2y + 2x + a)(2y - 2x - a) = 4b - a^2\)。
于是将\(4b - a^2\)的约数求出来,解一个二元一次方程就行了。
同时如果\(4b - a^2 = 0\),那么此时如果\(a\)是偶数输出inf,\(a\)是奇数输出0。
又\(|4b - a^2|\)最大可能达到\(10^{16}\),分解质因数可能需要Pollard_Rho。
代码
#include <cstdio>
#include <algorithm>
#include <vector>
long long A, B, C; int ans, f;
long long Mul(long long x, long long y, long long Mod)
	{ return (__int128) x * y % Mod; }
long long fastpow(long long x, long long y, long long Mod)
{
	long long ans = 1;
	for (; y; y >>= 1, x = Mul(x, x, Mod))
		if (y & 1) ans = Mul(ans, x, Mod);
	return ans;
}
bool Miller_Rabin(long long x)
{
	if (x == 2) return true;
	if ((x & 1) == 0) return false;
	for (int T = 10; T; T--)
	{
		long long a = 1ll * rand() * rand() % (x - 2) + 2;
		if (fastpow(a, x - 1, x) != 1) return false;
		long long p = x - 1;
		while (!(p & 1))
		{
			p >>= 1; long long t = fastpow(a, p, x);
			if (Mul(t, t, x) == 1 && t != 1 && t != x - 1) return false;
		}
	}
	return true;
}
long long Pollard_Rho(long long n)
{
	if ((n & 1) == 0) return 2;
	long long c = 1ll * rand() * rand() % (n - 1) + 1;
	long long i = 0, k = 2, x = 1ll * rand() * rand() % (n - 1) + 1, y = x;
	while (1)
	{
		++i, x = (Mul(x, x, n) + c) % n;
		long long d = std::__gcd((y - x + n) % n, n);
		if (d != 1 && d != n) return d;
		if (x == y) return n;
		if (i == k) y = x, k <<= 1;
	}
}
std::vector<long long> fac;
void Fact(long long n)
{
	if (n == 1) return;
	if (Miller_Rabin(n)) return (void) (fac.push_back(n));
	long long p = n; while (p == n) p = Pollard_Rho(n);
	Fact(p), Fact(n / p);
}
__int128 sqr(__int128 x) { return x * x; }
int check(long long p, long long q)
{
	long long xy = p - A, yx = q + A; int cnt = 0;
	if ((abs(xy) & 1) || (abs(yx) & 1) || ((p + q) & 3)) return 0;
	long long x = (xy + yx) / 4, y = (xy - x * 2) / 2;
	if (x >= 0 && y >= 0) ++cnt;
	return cnt;
}
void dfs(long long x, int dep)
{
	ans += check(x, f * C / x);
	for (int j = dep; j < (int) fac.size(); j++)
	{
		long long t = fac[j], s = x * t;
		for (; C % s == 0; s = s * t) dfs(s, j + 1);
	}
}
int main()
{
	scanf("%lld%lld", &A, &B); C = B * 4 - A * A, f = 1;
	if (C < 0) C = -C, f = -1; if (C == 0) return printf(A & 1 ? "0" : "inf"), 0;
	Fact(C), std::sort(fac.begin(), fac.end());
	fac.erase(std::unique(fac.begin(), fac.end()), fac.end());
	dfs(1, 0), printf("%d\n", ans);
	return 0;
}
												
											【XR-4】题的更多相关文章
- C算法编程题(五)“E”的变换
		
前言 上一篇<C算法编程题(四)上三角> 插几句话,说说最近自己的状态,人家都说程序员经常失眠什么的,但是这几个月来,我从没有失眠过,当然是过了分手那段时期.每天的工作很忙,一个任务接一个 ...
 - tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
		
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
 - 基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
		
请用C实现一个链表,实现链表的查找,逆置,替换,删除,添加,清空,创建. 查找.替换和删除.添加里面都会用到遍历链表的操作,所以重点在于遍历, 链表的逆置和清空考虑到效率,我们可以用递归实现, 至于创 ...
 - 【20171026早】alert(1) to win - 第六、七、八题
		
早上7点起床,又写了一篇小说发在了起点网上,有兴趣的可以看看.点击这里 忙完后,继续练习,刚开始发现自己答题的速度有些慢,可能是因为对于html,javascript知识不是很精通,但是话又说回来,谁 ...
 - ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)
		
●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...
 - AtCoder Grand Contest 11~17 做题小记
		
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
 - AtCoder Grand Contest 1~10 做题小记
		
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...
 - 数列分块入门九题(二):LOJ6280~6282
		
Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...
 - 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
		
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
 - 【noip模拟题】天神下凡(贪心)
		
vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...
 
随机推荐
- WCF学习笔记(一)---我的第一个WCF程序
			
一.创建WCF程序 1.创建一个控制台程序(WCFBlog) 2.添加wcf项目 3.将默认的IService1和Service1改成自己的名字 4.在ICalculateServic ...
 - 【转】 python_控制台输出带颜色的文字方法
			
在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...
 - 2019  游族网络java面试笔试题 (含面试题解析)
			
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.游族网络等公司offer,岗位是Java后端开发,因为发展原因最终选择去了游族网络,入职一年时间了,也成为了面 ...
 - nginx 配置跨域
			
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, ...
 - Matlab享元模式
			
享元模式(Flyweight)通过共享技术实现相同或相似对象的重用,可以减少创建对象的数量,以减少内存占用和提高性能.Java String的常量池,python logging,线程池,数据库连接池 ...
 - Java 之 Object 类
			
一.Object 概述 java.lang.Object 类是 Java 语言中的根类,即所有类的父类. 在对象实例化的时候,最终找的父类就是 Object. 如果一个类没有特别指定父类,那么默认则 ...
 - 自动化测试模型 Selenium IDE Selenium Gird2
			
1.线性测试 每个测试脚本相对独立,且不产生其他依赖与调用,其实就是单纯的来模拟用户完整的 操作场景.前一篇所写的测试脚本就属于线性测试. 优点:每个脚本完整且独立 缺点:测试用例的开发与维护成本高 ...
 - .Net core3.0 集成swagger5.0上传文件
			
.Net core 3.0已经更新了,相信有挺多博主大佬们都更新了如何在.Net core3.0使用swagger,这里就不详细说了. 我们知道,如果.net core 2.x使用swagger上传文 ...
 - VS2015配置Qt5
			
目录 需要准备的东西 VS2015 Qt5 VS2015 Qt插件 rc.exe无法启动 基于CMake的Qt工程 reference 需要准备的东西 Visual Studio 2015 Qt5 V ...
 - js刷新页面得重新加载和页面的刷新
			
1.reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当 ...