题目描述
题目描述 小明一天在做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
解题思路
这个题若是按照从i = 1到i * i<=(a+b)循环,直接找能被(a+b)整除的数字 会超时。所以直接来介绍一种比较高端的思路,当然是请教了大佬!
可以先去看一下我的另外一篇博客,质因数分解
我一开始也很懵。求能被一个数整除的数怎么跟质因数分解扯上关系的。但是仔细想一下,求能被整除的数其实就是求因子,比如说 一个数中质因数分解后有3个2,也就是 2^3 × \times ×(此处省略一堆质因数分解),那么1(2的0次方),2(2的1次方),4(2的2次方),8(2的3次方)都是这个数的因数,也就是都可以被这个数整除,那么假如说 一个数被分解成了 2∧3 × \times × 3∧2,那么其实他就有(3+1) × \times ×(2+1)个因子,因为由2构成的因子有4个(1,2,4,8) ,由3构成的因子就有3个(1,3,9)所以这些个数乘起来也是那个数的因子。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main() {
int k;
scanf("%d",&k);
while(k--) {
int a,b;
scanf("%d %d",&a,&b);
int x = a+b;
int ans = 1;//因为要进行×的运算,所以要初始化为1
for(int i = 2; i*i <= x; i++) {
if(x%i==0) {
int count = 0;
while(x%i==0) {
count++;
x /= i;
}
ans *= (count+1);
}
}
if(x!=1) printf("%d\n",ans*2); //如果最后剩下的数不是1 那么一定还有一个质因子
else printf("%d\n",ans);
}
}