P2613 有理数取余
原题链接 https://www.luogu.org/problemnew/show/P2613
在这里虽然是讲洛谷的题解,但用到的数论知识,归并到数论里也不为过!
进入正题:
首先看到题面:给出一个有理数c=a/b,求c mod 19260817的值。
看一下数据范围

我滴天!!!又要写高精???GG无疑!!!
咦,既然要取余,还做乘法运算,那只要写个快读在读入时取膜不就好啦,这样就爆不了long long 了。
有理数求余???搞笑呢,不是只有整数求余嘛?
我们知道有理数包含整数和分数,那么分数求余我们都知道是没有什么意义的。
那肿么办呢?——转化!!!
前面说过这是一道数论题,那么解此题一定要用到数论知识!!!
在我发现的数论知识里,可以用以下两个知识来解此题:
1.费马小定理
如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
此题已经明确给出mod数19260817,显然它是一个质数,那么我们就可以用费马小定理转化一下,如下:
因为a^(p-1)≡1(mod p)
所以a^(p-2)≡a^(-1) (mod p) (A)
所以c=a/b=a*b^(-1)≡a*b^(p-2) (mod p)
证毕!
所以我们就可以将在膜p意义下的a/b转化成a*b^(p-2)的形式,所以我们只要求出b^(p-2)就大功告成啦,具体做法用快速幂。
2.扩展欧几里德
上面已经证过求在膜p意义下的a/b就是求a*b^(-1),b^(-1)就是b的逆元
下面给出求b的逆元的一种方法:
若存在一个数x,满足bx≡1 (mod p),那么x就是b的逆元
可将bx≡1 (mod p)进一步转化:
bx-1≡0 (mod p)
bx-1=-yp (注:这里说一下为什么是-y,其实这里是不是正负无所谓,写成负的更便于理解)
bx+py=1
化简到这里我们就知道要用扩展欧几里德做了,求出了b的逆元x后再乘a取膜就是最后答案啦,下面看代码:
#include<iostream>
#include<cstdio>
using namespace std;
const long long mod=;
inline long long read() //快读,边读边取余
{
long long t=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='')
{
t=(t*+(ch-''))%mod;
ch=getchar();
}
return t;
}
int exgcd(long long a,long long b,long long &x,long long &y) //扩展欧几里德算法,求b的逆元
{
if(b==)
{
x=;y=;
return a;
}
long long r=exgcd(b,a%b,x,y);
long long q=x;
x=y;
y=q-a/b*y;
return r;
}
int main()
{
long long a,b,x,y;
a=read();
b=read();
if(b==) //一步特判,因为b是分母不能是0,如果b==0则无解
{
cout<<"Angry!";
return ;
}
exgcd(b,mod,x,y);
x=(x%mod+mod)%mod; //这步操作是确保x是b的逆元中最小的正整数
printf("%lld",(a%mod*x%mod)%mod); //记得多膜几次哦
return ;
}
其实作为一个提高+/省选-是不是有点夸大了?
P2613 有理数取余的更多相关文章
- 洛谷P2613有理数取余
传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- 洛谷 P2613 【模板】有理数取余
P2613 [模板]有理数取余 题目描述 给出一个有理数c=\frac{a}{b}c=ba,求c\ \bmod 19260817c mod19260817的值. 输入输出格式 输入格式: 一共两行. ...
- 洛谷——P2613 【模板】有理数取余
P2613 [模板]有理数取余 读入优化预处理 $\frac {a}{b}\mod 19620817$ 也就是$a\times b^{-1}$ $a\times b^{-1}\mod 19620817 ...
- P2613 【模板】有理数取余 (数论)
题目 P2613 [模板]有理数取余 解析 简单的数论题 发现并没有对小数取余这一说,所以我们把原式化一下, \[(c=\frac{a}{b})\equiv a\times b^{-1}(mod\ p ...
- 题解 P2613 【【模板】有理数取余】
题目链接 我们先看这个式子: $c=\dfrac{a}{b}$ $ $ $ $ $mod$ $ $ $ $ $19260817$ 某正常高中生:这$……$ --- 对于这个 $c$ . 显然,它很可能 ...
- 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)
题面 题目描述 给出一个有理数 c=\frac{a}{b} ,求 c mod19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...
- P2613 【模板】有理数取余
题目描述 给出一个有理数 $c=\frac{a}{b}$ ,求 c mod 19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 aa .第二行,一个整数 bb . 输出格 ...
- 数学【p2613】 【模板】有理数取余(费马小定理)
题目描述 给出一个有理数 c=a/b ,求 c mod 19260817的值. 说明 对于所有数据, 0≤a,b≤10^10001 分析: 一看题 这么短 哇简单!况且19260817还是个素数!(美 ...
- Luogu P2613 【模板】有理数取余
题目链接 \(Click\) \(Here\) 真心没啥东西,只要能\(Get\)到在数字输入的时候按位取模,以及除数也可以直接取模就可以了.(把每个数看做乘法原理和加法原理构造起来的即可.) #in ...
随机推荐
- Arcgis瓦片--数据获取
Arcgis的二维地图瓦片有两种获取方式 1.在Arcmap中对配置好的地图进行切图,生成对应瓦片 2.使用第三方的地图下载器,直接下载,导出成arcgis瓦片格式即可使用. 备注:这里主要介绍第二种 ...
- gitbook 入门教程之实用插件(新增3个插件)
插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...
- Git:八、Git自定义:忽略特殊文件&配置别名
1..gitignore配置文件 1)防止加入Git或输入git status时显示,需要让Git忽略的文件: 程序编译生成的非原代码的文件 存放密码的文件 2)配置文件:.gitignore Git ...
- Python ——报错集锦
https://blog.csdn.net/weixin_42660771/article/details/80990665 错误(1):SyntaxError:'return' outside fu ...
- Python运算符之翩若惊鸿,婉若游龙
python中的运算符算术运算符:主要用于两个对象算数计算(加减乘除等运算)比较运算符:用于两个对象比较(判断是否相等.大于等运算)赋值运算符:用于对象的赋值,将运算符右边的值(或计算结果)赋给运算符 ...
- Swift代理的使用
Swift代理的使用 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议 ...
- gradlew和gradle的区别
概念理解 gradlew就是对gradle的包装和配置,gradlew是gradle Wrapper,Wrapper的意思就是包装. 因为不是每个人的电脑中都安装了gradle,也不一定安装的版本是要 ...
- vue SSR : 原理(一)
前言: 由于vue 单页面对seo搜索引擎不支持,vue官网给了一个解决方案是ssr服务端渲染来解决seo这个问题,最近看了很多关于ssr的文章, 决定总结下: 参考博客:从0开始,搭建Vue2.0的 ...
- ElasticSearch(九):elasticsearch-head插件安装
安装node 安装elasticsearch-head需要node.js的支持. 下载最新的node.js,下载地址:https://nodejs.org/en/download/ 将下载后的安装包放 ...
- pybind11 安装
Prerequisites: $ sudo apt-get install python-dev (or python3-dev) $ sudo apt-get install cmake $ su ...