[习题练习] SGU 119

题意

给定\(A_0, B_0, N\), 让你求\(A_0x+B_0y | N\)的情况下,同时存在\(Ax + By | N\)\((x, y)\)的解。

样例

输入

3
1 2

输出

0 0
1 2
2 1

题解

一开始做没想出来,但是看了题解发现是sb题。

我们知道\(A_0x + B_0y = Nk\)(\(k,c\)是常数),那么同时就必然有\(A_0cx +B_0cy = c(A_0x + B_0y) = cNK\)

由于是\(\bmod n\)意义下的,所以我们可以知道\(A = A_0c \bmod N\),\(B=B_0C \bmod N\),然后算出循环节即可。

代码

int n, A, B;

vector < pair< int, int> > ans;

inline int gcd(int a, int b) {
	if(a < b) swap(a, b);
	return b == 0 ? a : gcd(b, a % b);
}

inline int lcm(int a, int b) {
	return 1ll * a * b / gcd(a, b);
}

int main() {
	read(n); read(A); read(B);
	int a = n / gcd(A, n), b = n / gcd(B, n), c = lcm(a, b);
	for(int i = 1; i <= c; i++) {
		ans.push_back(make_pair(i * A % n, i * B % n));
	}
	sort(ans.begin(), ans.end());
	printf("%d\n", c);
	for(int i = 0; i < c; i++) {
		printf("%d %d\n", ans[i].first, ans[i].second);
	}
	return 0;
}
posted @ 2020-09-01 14:22  Hock  阅读(127)  评论(0编辑  收藏  举报