[习题练习] 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;
}