NOIP 2001 最大公约数和最小公倍数问题

NOIP 2001 最大公约数和最小公倍数问题

很有趣的一个数学问题,这一周看完《背包九讲》后,就开始看CCF出的NOIP2001-2003的题解.之前认为很水的题目的最优算法相当精妙,这进一步认证了仅仅AC是不够的,还需要进一步研究算法.

题意略.需要注意的是,题目仅仅需要求出符合条件的数对的个数,而非答案.
因而,我们可以利用一些数学分析得到一个非常简洁的结论:
以x0,y0分别为最大公约数和最大公倍数的数对个数为2^n,n是y0/x0的不同质因子个数.

 

 1 #include < stdio.h >
 2 int  main()
 3 {
 4  int x0, y0, x, i = 2, k = 0;
 5  scanf(“%d%d”, &x0, &y0);
 6  if (y0 % x0 != 0{printf(“0\n”); return 0;}
 7  x = y0 / x0;
 8  while (x != 1)
 9  {
10    while (x % i != 0) i++; k++;
11    while (x % i == 0) x /= i;
12  }

13  printf(“%d\n”, 1<<(k));
14}

你可能感兴趣的:(NOIP 2001 最大公约数和最小公倍数问题)