Strange Fractions[2021 ICPC 上海站 D]&U207965 Strange Fractions 增强版
参考(全题解)
题目链接中,增强版 T 增加到了 1e6,并要求 a,b 互质,ban掉了第一种做法(赛版不要求 a,b 互质);

题目大意

给定一个正分数 pq\frac pqqp​,我们需要找到两个正整数 a,ba,ba,b 满足 pq=ab+ba\frac pq=\frac ab+\frac baqp​=ba​+ab​ ,如果不存在,则输出 0,00,00,0 ;
( 1≤T≤105,1≤p,q≤1071≤T≤10^5,1≤p,q≤10^71≤T≤105,1≤p,q≤107 ,要求 1≤a,b≤1091≤a,b≤10^91≤a,b≤109 )

试差

思路

在 p,q 化为最简后,等价于寻找 a,b 满足 a2+b2ab=pq\frac{a^2+b^2}{ab}=\frac pqaba2+b2​=qp​ ,我们只需要预处理出所有小于 1e7 的平方数,依次匹配~
时间复杂度 O(Tp)O(T\sqrt p)O(Tp​) ;

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int twi[10004];
int tti[10000007];
int main()
{int t,p,q;for(int i=1;i*i<=10000000;i++){twi[i]=i*i;tti[i*i]=i;}cin>>t;while(t--){scanf("%d%d",&p,&q);if (p < 2 * q) {printf("0 0\n");continue;}int g=__gcd(p,q);p/=g,q/=g;int f=0;for(int i=1;twi[i]<=p&&!f;i++){int lst=tti[p-twi[i]];if(lst&&i*lst==q){printf("%d %d\n",min(i,lst),max(i,lst));f=1;}}if(!f)printf("0 0\n");}
}

二进制枚举

思路

我们可以证明 a,b 互质时 gcd(a2+b2,ab)=1gcd(a^2+b^2,ab)=1gcd(a2+b2,ab)=1 成立, pq\frac pqqp​化简后,我们便可以处理出 p 的所有互质因子对 a,b ,并验证与 q 的关系;
至于为什么要求是互质因子对,可以简化枚举过程和省略枚举后的约分,由于质因子最多8个(2⋅3⋅5⋅7⋯192\cdot3\cdot5\cdot 7\cdots192⋅3⋅5⋅7⋯19),所以时间复杂度 O(T28)O(T2^8)O(T28) ;

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e7;
int pri[N + 7], c = 0, mrk[N + 7];
bool n[N + 7];
void prime()
{n[0] = n[1] = 1;for (int i = 2; i <= N; i++){if (!n[i])pri[c++] = i, mrk[i] = i;for (int j = 0; j < c && i * pri[j] <= N; j++){n[i * pri[j]] = 1;mrk[pri[j] * i] = pri[j];if (i % pri[j] == 0){mrk[pri[j] * i] *= mrk[i];break;}}}
}
int v[10];
void solve()
{int tot = 0, f = 0, a, b, p, q;scanf("%d%d", &p, &q);if (p < 2 * q){printf("0 0\n");return;}int g = __gcd(p, q);p /= g, q /= g;tot = 0, f = 0;while (q != 1){v[tot++] = mrk[q];q /= mrk[q];}for (int i = 0; i < (1 << tot); i++){a = 1, b = 1;for (int j = 0; j < tot; j++){if ((i >> j) & 1)a *= v[j];elseb *= v[j];}if (a * a + b * b == p){printf("%d %d\n", min(a, b), max(a, b));return;}}printf("0 0\n");return;
}
int main()
{int t;prime();cin >> t;while (t--){solve();}
}

求根公式

思路

不妨设 ab=x\frac ab=xba​=x ,那么有 pq=x+1x\frac pq=x+\frac1xqp​=x+x1​ ,问题转化为求 qx2−px+q=0qx^2-px+q=0qx2−px+q=0 的有理根;
由于求根公式 x=p+p2−4q22qx=\frac{p+\sqrt{p^2-4q^2}}{2q}x=2qp+p2−4q2​​ ,在判断根式有理后,即可获得分子分母;
时间复杂度 O(Tlog⁡p)O(T\log p)O(Tlogp) ;

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ll t,p,q;cin>>t;while(t--){scanf("%lld%lld",&p,&q);if (p < 2 * q) {printf("0 0\n");continue;}ll g=__gcd(p,q);p/=g,q/=g;ll s=(ll)sqrt(p*p-4*q*q);if(s>=0&&s*s==p*p-4*q*q){ll fz=p+s,fm=2*q;ll gtmp=__gcd(fz,fm);fz/=gtmp,fm/=gtmp;printf("%lld %lld\n",min(fz,fm),max(fz,fm));}else printf("0 0\n");}
}

ED

\

Strange Fractions(奇怪的分数)-数论相关推荐

  1. usaco ★Fractions to Decimals 分数化小数

    ★Fractions to Decimals 分数化小数 写一个程序,输入一个形如 N/D 的分数(N 是分子,D 是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中.例如, ...

  2. 1439: 2.4.5 Fractions to Decimals 分数化小数

    1439: 2.4.5 Fractions to Decimals 分数化小数 时间限制: 1 Sec  内存限制: 64 MB 提交: 194  解决: 13 题目描述 写一个程序,输入一个形如N/ ...

  3. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  4. fractions -- 分数

    前情提示: 测试代码中,右尖括号(>)表示命令行中输入的命令: 单独一行并以井字符(#)开头的为输出结构: 库的导入仅在本文的第一个测试代码中展现,其他代码块均省略库的导入代码. 系统类型: W ...

  5. python:fractions --- 分数

    python:fractions --- 分数 fractions 模块支持分数运算. 分数实例可以由一对整数,一个分数,或者一个字符串构建而成. class fractions.Fraction(n ...

  6. python分数约分_Python基础知识

    #全部行都能输出 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_intera ...

  7. fractions库的使用

    fractions库的使用 分数库:fractions 参数说明 结果 分数库:fractions 函数或属性 功能 备注 Fraction(value: float, *, _normalize: ...

  8. 用html写出分子分母,数学中的分数分子分母用英文拼写方法

    数学中的分数分母分子的英文拼写方法 分数:fractions 分子:numerator 分母:denominator 数学中的分数分类及英文拼写 分数:fractions 繁分数:mixed numb ...

  9. Python fractions 模块介绍

    fractions - 分数 fractions 模块是Python3内置的标准库,无需pip安装,在使用时直接导入就行 fractions 模块支持分数运算. 将小数表示成分数(分数约分,分数计算) ...

最新文章

  1. php in_array 遍历,in_array大数组查询性能问题
  2. 分析Windows和Linux动态库
  3. C++Primer笔记-----day04
  4. 【数据结构与算法】【算法思想】分治算法
  5. sql开启mysql远程连接_SQLServer2008设置开启远程连接
  6. mysql讀取sql_MySQL数据库之python json及mysql读取json文件存sql等问题
  7. Java IO的一些列子
  8. Python中的字符串特性(索引、切片、重复、连接、成员操作符号)
  9. python下载-python
  10. pyglet: a cross-platform windowing and multimedia
  11. 使用升级版的 Bootstrap typeahead v1.2.2
  12. 对比找出两张Excel表的不同数据
  13. html鼠标悬停显示箭头,Tippy.js 玩转鼠标悬停提示信息
  14. windows 文件系统
  15. 跨国面板数据(1960-2020)十三:GDP、人均GDP、国民收入、储蓄(excel、stata版)
  16. 2022年湖南省中医执业医师考试第三单元医学针灸学模拟题
  17. Whiten process——数据的白化处理
  18. android 图片自动裁剪图片,Android实现拍照、选择相册图片并裁剪功能
  19. qute图(女生勿进
  20. 用计算机遥感技术图片,遥感简答题

热门文章

  1. 【Proteus仿真】【51单片机】音乐盒电子琴设计
  2. php get 号,php-GET请求不带问号
  3. 钢条切割算法python实现
  4. View UI (iview)表格合并单元格(行/列合并)
  5. ug10.0许可证服务器失败,ug10.0许可错误
  6. 【opencv 450 Image Processing】Periodic Noise Removing Filter周期性去噪滤波器
  7. 应用层HTTP数据包的截获与还原技术的实现
  8. android系统APK签名生成大全
  9. 盘点 | CES2023落幕!新能源车、显示技术、AI/元宇宙、芯片…百花齐放百家争鸣中……
  10. Uipath的下载与使用教程