P2613 【模板】有理数取余
题面
给出一个有理数 ,求 的值。
输入格式
一共两行。
第一行,一个整数 。
第二行,一个整数 。
输出格式
一个整数,代表求余后的结果。如果无解,输出 Angry!
。
数据范围
对于所有数据,保证 ,,且 不同时是 的倍数。
思路
前置思路
建议先以下题目
基础思路
std::fmod
是没用滴。
式子变一下形:
然后就是对 求逆元(可以用exgcd),然后就直接乘就好了。
(无解就是 )
快读
如果你这样提交了,那么只有 分。因为数据范围太大了。
不想写高精度
你需要一边读一边取模,而这可以用快读实现。
快读带取模参考代码:(来源:题解 P2613 【【模板】有理数取余】
)
inline int read() {
int res = 0, ch = getchar();
while(!isdigit(ch) and ch != EOF){
ch = getchar();
}
while(isdigit(ch)) {
res = (res << 3) + (res << 1) + (ch - '0');
res %= MOD;
ch = getchar();
}
return res;
}
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int x,y;
const int MOD = 19260817;
int a,b;
inline int read() {
int res = 0, ch = getchar();
while(!isdigit(ch) and ch != EOF){
ch = getchar();
}
while(isdigit(ch)) {
res = (res << 3) + (res << 1) + (ch - '0');
res %= MOD;
ch = getchar();
}
return res;
}
void exgcd(int a,int b) {
if(b==0) {
x=1;
y=0;
} else {
exgcd(b,a%b);
int tmp=x;
x=y;
y=tmp-a/b*y;
}
}
signed main() {
a=read(),b=read();
if(b==0) {
printf("Angry!");
return 0;
}
exgcd(b,MOD);
x=(x+MOD)%MOD;
cout<<a*x%MOD<<endl;
return 0;
}
分类:
OI-做题笔记
标签:
数论,数学
, 扩展欧几里得,exgcd
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战