做这题的时候真的是脑子短路了,记录一下。
首先已知一个解了,由于有mod n这个东西,所以剩下的解肯定为已知解的x倍mod n,于是在a和b上进行操作就可以了,循环节为n / gcd(n, a),那么a和b的循环节都求出来,他们的lcm就是公共循环节,也就是答案的个数了
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int n, a, b;
vector<pair<int, int> > ans;
int gcd(int a, int b) {
if (!b) return a;
return gcd(b, a % b);
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int main() {
while (~scanf("%d", &n)) {
scanf("%d%d", &a, &b);
ans.clear();
a %= n, b %= n;
int x = n / gcd(a, n);
int y = n / gcd(b, n);
int d = lcm(x, y);
for (int i = 0; i < d; i++)
ans.push_back(make_pair(a * i % n, b * i % n));
sort(ans.begin(), ans.end());
printf("%d\n", d);
for (int i = 0; i < d; i++)
printf("%d %d\n", ans[i].first, ans[i].second);
}
return 0;
}