社区讨论

关于扩欧与卡常

P3811【模板】模意义下的乘法逆元参与者 6已保存回复 16

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
16 条
当前快照
1 份
快照标识符
@locdfzyi
此快照首次捕获于
2023/10/30 11:59
2 年前
此快照最后确认于
2023/11/04 23:42
2 年前
查看原帖
这题是故意卡扩欧的吗。。。
T 了最后一个点:评测记录
O2 也开了,快读快写也用了,inline 也用了,register 也用了,我想不出哪里还可以卡常了。
请问扩欧的话卡常还有救吗?如果可以,如何优化?
(不行的话我就跑去写递推了)
80pts 的代码:
CPP
#include <bits/stdc++.h>

int ra, rp;

inline void out(int x) {
	int f[16], i = 0;
	while (x > 0) {
		++i;
		f[i] = x % 10 + '0';
		x = x / 10;
	}
	while (i > 0) {
		putchar(f[i]);
		--i;
	}
	putchar('\n');
}

inline int read() {
	register int a = getchar(), b = 0;
	while (a > '9' || a < '0') {
		a = getchar();
	}
	while (a >= '0' && a <= '9') {
		b = b * 10 + a - '0';
		a = getchar();
	}
	return b;
}

int exgcd(int a, int b, int &x, int &y) {
	if (a < b) {
		exgcd(b, a, x, y);
	}
	int m = 0, n = 1;
	x = 1, y = 0;
	while (b != 0) {
		int d = a / b, t;
		t = m; m = x - d * t; x = t;
        t = n; n = y - d * t; y = t;
        t = a % b; a = b; b = t;
	}
	return a;
}

inline int inv(int a, int p) {
	int x, y;
	exgcd(a, p, x, y);
	x = x % p;
    return x >= 0 ? x : p + x;
}

int main() {
	ra = read(); rp = read();
	for (register int i = 1; i <= ra; i++) {
		out(inv(i, rp));
	}
	return 0;
}

请求支援,谢谢!

回复

16 条回复,欢迎继续交流。

正在加载回复...