Strange Fractions(奇怪的分数)-数论
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(Tlogp)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(奇怪的分数)-数论相关推荐
- usaco ★Fractions to Decimals 分数化小数
★Fractions to Decimals 分数化小数 写一个程序,输入一个形如 N/D 的分数(N 是分子,D 是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中.例如, ...
- 1439: 2.4.5 Fractions to Decimals 分数化小数
1439: 2.4.5 Fractions to Decimals 分数化小数 时间限制: 1 Sec 内存限制: 64 MB 提交: 194 解决: 13 题目描述 写一个程序,输入一个形如N/ ...
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- fractions -- 分数
前情提示: 测试代码中,右尖括号(>)表示命令行中输入的命令: 单独一行并以井字符(#)开头的为输出结构: 库的导入仅在本文的第一个测试代码中展现,其他代码块均省略库的导入代码. 系统类型: W ...
- python:fractions --- 分数
python:fractions --- 分数 fractions 模块支持分数运算. 分数实例可以由一对整数,一个分数,或者一个字符串构建而成. class fractions.Fraction(n ...
- python分数约分_Python基础知识
#全部行都能输出 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_intera ...
- fractions库的使用
fractions库的使用 分数库:fractions 参数说明 结果 分数库:fractions 函数或属性 功能 备注 Fraction(value: float, *, _normalize: ...
- 用html写出分子分母,数学中的分数分子分母用英文拼写方法
数学中的分数分母分子的英文拼写方法 分数:fractions 分子:numerator 分母:denominator 数学中的分数分类及英文拼写 分数:fractions 繁分数:mixed numb ...
- Python fractions 模块介绍
fractions - 分数 fractions 模块是Python3内置的标准库,无需pip安装,在使用时直接导入就行 fractions 模块支持分数运算. 将小数表示成分数(分数约分,分数计算) ...
最新文章
- php in_array 遍历,in_array大数组查询性能问题
- 分析Windows和Linux动态库
- C++Primer笔记-----day04
- 【数据结构与算法】【算法思想】分治算法
- sql开启mysql远程连接_SQLServer2008设置开启远程连接
- mysql讀取sql_MySQL数据库之python json及mysql读取json文件存sql等问题
- Java IO的一些列子
- Python中的字符串特性(索引、切片、重复、连接、成员操作符号)
- python下载-python
- pyglet: a cross-platform windowing and multimedia
- 使用升级版的 Bootstrap typeahead v1.2.2
- 对比找出两张Excel表的不同数据
- html鼠标悬停显示箭头,Tippy.js 玩转鼠标悬停提示信息
- windows 文件系统
- 跨国面板数据(1960-2020)十三:GDP、人均GDP、国民收入、储蓄(excel、stata版)
- 2022年湖南省中医执业医师考试第三单元医学针灸学模拟题
- Whiten process——数据的白化处理
- android 图片自动裁剪图片,Android实现拍照、选择相册图片并裁剪功能
- qute图(女生勿进
- 用计算机遥感技术图片,遥感简答题
热门文章
- 【Proteus仿真】【51单片机】音乐盒电子琴设计
- php get 号,php-GET请求不带问号
- 钢条切割算法python实现
- View UI (iview)表格合并单元格(行/列合并)
- ug10.0许可证服务器失败,ug10.0许可错误
- 【opencv 450 Image Processing】Periodic Noise Removing Filter周期性去噪滤波器
- 应用层HTTP数据包的截获与还原技术的实现
- android系统APK签名生成大全
- 盘点 | CES2023落幕!新能源车、显示技术、AI/元宇宙、芯片…百花齐放百家争鸣中……
- Uipath的下载与使用教程