Description
题目描述
小明一天在做a+b时,突然他想知道a+b能被哪些数整除了?比如说2+4=6,能整除6的数有1,2,3,6,一共4个。 请你帮他算一下,a+b的和能被几个数整除。
输入
第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,(1≤a,b≤1e9)。
输出
每行输出一个样例的结果,为一个整数。
样例输入
2 2 3 4 2样例输出
2 4
解题思路:本题还是顺着《质因数分解》的分解思想去思考。
任意一个正整数可以分解成唯一的质因数的乘积,形如 t = a^x * b^y * ···· * d^z 。那 t 可以被多少个数给整除? a可以整除t,a^2可以乘除t,a^x也可以整除t,b可以,b^y也可以。。。
由质因数a的x次幂,可得有 x 个数可以整除 t;由 质因数b的y次幂,可得有 y 个数可以整除 t。
所以根据简单的排列组合知识,可以得出有 x * y * ···· * z 种数可以整除 t 。 但是在排列组合的中,还有一种情况千万别忽略———某质因数是否进行了排列组合。例如现在 不要c , 只挑选质因数 a,b,d 进行组合,也是可以组成整除t的数。 所以实际上 一共有 (x+1)*(y+1)* ···· *(z+1)个数可以整除 t 。
这就是为什么 初始时要 cnt = 1 (第16行), 为什么对 指数为1 的质因数 这种情况要 * 2(第25行)
AC代码:
#include <stdio.h>
int main()
{
int K,a,b,sum,ans,cnt;
scanf("%d",&K);
while ( K-- )
{
scanf("%d %d",&a,&b);
sum = a + b;
ans = 1;
for ( int i = 2; i*i <= sum; i ++)
{
if (sum % i == 0)
{
cnt = 1;
while (sum % i == 0)
{
cnt ++;
sum /= i;
}
ans *= cnt;
}
}
if ( sum != 1) ans *= 2;
printf("%d\n",ans);
}
return 0;
}