湘大1218 A+BVIII

题目描述

题目描述 小明一天在做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);
	}
} 
  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值