数学/欧几里得/ sgu119 Magic Pairs
题意
给出三个数n,a1,b1,表示n|a1*x+b1*y对任意(x,y)成立。现在求出有多少对(a2,b2)使得n|a2*x+b2*y也成立,并打印所有符合要求的(a2,b2)
分析
因为a1,b1是满足要求的,当a2=(k*a1)%n,b2=(k*a2)%n为满足条件的a2b2,直到(a2,b2)=(a1,b1)结束
Accepted Code
1 /* 2 PROBLEM:sgu119 3 AUTHER:Rinyo 4 MEMO:数学 5 */ 6 7 8 #include<cstdio> 9 #include<algorithm> 10 using namespace std; 11 int gcd(int x,int y){if (y==0) return x;return gcd(y,x%y);} 12 struct node 13 { 14 int x,y; 15 friend bool operator < (const node &a, const node &b) 16 { 17 if(a.x != b.x) return a.x < b.x; 18 return a.y < b.y; 19 } 20 }ans[10030]; 21 int main() 22 { 23 int n,a1,b1; 24 scanf("%d%d%d",&n,&a1,&b1); 25 a1=a1%n;b1=b1%n; 26 int i=n/gcd(n,a1),j=n/gcd(n,b1); 27 int sum=i*j/gcd(i,j); 28 for (int i=1;i<=sum;i++) 29 { 30 ans[i].x=(a1*i)%n; 31 ans[i].y=(b1*i)%n; 32 } 33 sort(ans+1,ans+1+sum); 34 printf("%d\n",sum); 35 for (int i=1;i<=sum;i++) printf("%d %d\n",ans[i].x,ans[i].y); 36 return 0; 37 }