P2613 【模板】有理数取余

题面

给出一个有理数 c=ab,求 cmod19260817 的值。

输入格式

一共两行。

第一行,一个整数 a
第二行,一个整数 b

输出格式

一个整数,代表求余后的结果。如果无解,输出 Angry!

数据范围

对于所有数据,保证 0a10100011b1010001,且 a,b 不同时是 19260817 的倍数。

思路

前置思路

建议先以下题目

基础思路

std::fmod 是没用滴。

式子变一下形:

c=a÷b(mod19260817)

c=a×b1(mod19260817)

然后就是对 b 求逆元(可以用exgcd),然后就直接乘就好了。

(无解就是 b=0

快读

如果你这样提交了,那么只有 0 分。因为数据范围太大了。

不想写高精度

你需要一边读一边取模,而这可以用快读实现。

快读带取模参考代码:(来源:题解 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;
}

posted @   蒟蒻xiezheyuan  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示