题目是这样的:
给出一个二元组(A,B)
求出无序二元组(a,b) 使得(a|A,b|B)的组数
无序意思就是(a,b)和(b,a) 算一组.
输入描述:
第一行数据T(1<=T<=10000)
接下来T行,每行两个整数 A,B(1<=A,B<=10000)
输出描述:
共T行,每行一个结果
示例1
输入
1
4 6
输出
11
样例解释: 二元组如下:
(1,1)(1,2)(1,3)(1,6)
(2,1)(2,2)(2,3)(2,6)
(4,1)(4,2)(4,3)(4,6)
共12组.
无序二元组如下:
(1,1)(1,2)(1,3)(1,6)
(2,2)(2,3)(2,6) (4,1)
(4,2)(4,3)(4,6)
共11组
本来想明天再写呢,但一直有今日事今日毕的情节,就大致写下思路吧:本题一看便是求整数因子个数的问题,分别求出A和B的因子个数做乘积运算,那么算出的是全部的二元组个数,还需要减去相同的那一部分即类似(1,4)(4,1)这种无序对。举个例子,若A=10,B=20 则A的因子为(1,2,5,10)B的因子为(1,2,4,5,10,20),我们发现需要减去的是(1,2)(1,5)(1,10)(2,5)(2,10)(5,10),即是A和B相同因子个数“累加”,这个“累加”为1+2+3+..N(N为相同因子个数-1)那么本题就很容易解决了,怎么求因子个数?来先看A,若找到ai是A的一个因子,那么A/ai必然也是A的因子,这样只需枚举到根号A,最后判断一下根号A即可,看代码(代码写的有点啰嗦,先这样看着吧)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
int a[11000];
int b[11000];
int c[11000];
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int A,B;
scanf("%d%d",&A,&B);
int A1=sqrt(A);
int B1=sqrt(B);
int t1=0,t2=0;
memset(c,0,sizeof(c));
for(int i=1; i<=A1; i++)
{
if(A%i==0&&i!=A/i)
{
a[t1]=i;
a[t1+1]=A/i;
t1+=2;
c[i]++;
c[A/i]++;
}
else if(A%i==0&&i==A/i)
{
a[t1++]=i;
c[i]++;
}
}
for(int j=1;j<=B1;j++)
{
if(B%j==0)
{
b[t2]=j;
b[t2+1]=B/j;
t2+=2;
c[j]++;
c[B/j]++;
}
else if(B%j==0&&j==B/j)
{
a[t2++]=j;
c[j]++;
}
}
int Max=max(A,B);
int num=0;
for(int i=0;i<=Max;i++)
if(c[i]==2)
num++;
printf("%d\n",t1*t2-(num-1)*num/2);
}
return 0;
}