链接:https://www.nowcoder.com/acm/contest/185/A
来源:牛客网

题目描述

给出一个二元组(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
4 6
输出例子:
11

-->

示例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组

$n^2$的暴力应该无脑写吧,就不在此多说了,直接讲正解。
a和b$\le$10000,我不知道在一个循环里,for(i=1 ->max(a,b)),然后判断i与a,b的大小这样来枚举a,b的因数可不可以过,$1000 \times 10000$说不定可以试试。
我们来说我比较安全的解法。
我们需要先找出A,B每个数的因子个数,当然我们需要枚举,假设我们在枚举找出A的一个a,那么A/a又何尝不是另一个因子,这样的话我们找到一个因子,因子数加2,当然这个数最大为

为$\sqrt A \times \sqrt A$,所以我们对于每个T最多枚举$ \sqrt A + \sqrt B$次,当然对于$\sqrt A$是A 的因子这种$i = A/ i $的情况需要特殊判断一下,只能因字数加1.

对于A的每个因子,用一个数组标记一下,为了方便判断B的因子中有多少个与之相同的数的个数。

同样的方法,我们求出B的同时记录有多少个相同的因子。

下面来说找出相同的因子数的个数怎么用。

设A的因字数为:1 3 4 5

设B的因子数为:1 4 5 7

我们用A的因子来配B的因子:1(4种),3(4种),4(3种),5(2种)

我们发现若这个数不是公共因子,那么对于每个数情况个数都为B的因子数量,若为公共因子,第一次出现情况数为B的因字数,第二次出现为B的因字数-1,第三次-2...。

那么答案就可以计算为:A的因子的个数$\times$B的因子的个数-1-2-...-(公共因子数-1)。

对于-1-2..这部分可以稍微优化一下,作用不是很大啦。

if(sumv%==)sumv=(sumv+)*(sumv/);
else sumv=(sumv+)*(sumv/)+; //sumv表示公共因子个数。

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int T,a,b,suma,sumb,sumv;
bool vis[];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,,sizeof(vis));
suma=sumb=sumv=;
scanf("%d%d",&a,&b);
int p=sqrt(a);
int q=sqrt(b);
for(int i=; i<=p; i++)
{
if(a%i==)
{
if(a/i==i)suma+=,vis[i]=;
else suma+=,vis[i]=vis[a/i]=;
}
} for(int i=; i<=q; i++)
{
if(b%i==)
{
if(b/i==i)sumb+=,sumv+=vis[i];
else sumb+=,sumv+=vis[i],sumv+=vis[b/i];
}
}
sumv--;
if(sumv%==)sumv=(sumv+)*(sumv/);
else sumv=(sumv+)*(sumv/)+;
printf("%d\n",suma*sumb-sumv);
}
}

牛客OI赛制测试赛2 A 无序组数的更多相关文章

  1. 【牛客OI赛制测试赛3】 毒瘤xor

    牛客OI赛制测试赛3 毒瘤xor 传送门 题面,水表者自重 Solution 前缀和简单题(挖坑待补) 代码实现 #include<stdio.h> #define int long lo ...

  2. 牛客OI赛制测试赛2(0906)

    牛客OI赛制测试赛2(0906) A :无序组数 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序意思就是(a,b)和(b,a) 算一组. 输入描述: ...

  3. 牛客OI赛制测试赛2

    A题: https://www.nowcoder.com/acm/contest/185/A 链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题 ...

  4. 8.30 牛客OI赛制测试赛1 F题 子序列

    题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数.对于每组数据,第一行两个整数N,k,含义如题所 ...

  5. C数列下标 牛客OI赛制测试赛2

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的 ...

  6. 牛客OI赛制测试赛2 D 星光晚餐

    链接:https://www.nowcoder.com/acm/contest/185/D来源:牛客网 题目描述 Johnson和Nancy要在星光下吃晚餐.这是一件很浪漫的事情. 为了增加星光晚餐那 ...

  7. 牛客OI赛制测试赛2 C 数组下标

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 题目描述 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 ...

  8. Nowcoder | [题解-N189]牛客OI赛制测试赛3

    这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...

  9. 牛客OI赛制测试赛-序列-模拟

    哇这道题好坑啊,可能是我太菜了 题意就是叫把一个连续序列分成K组,使得每个组的和都相等 我最开始的想法是由于要分成K组,那我们知道,每组一定有sum(a[i])/k这样我们只需要每次当num==sum ...

随机推荐

  1. CoreBluetooth Central模式 Swift版

    也是醉了,CB这个API到现在也没有Swift的文档.最新的文档还是3年前还是4年前的OC版的,被雷的外焦里嫩的.自己一点一点写成Swift还各种报错,最坑的是这些错误压根找不到解决方案.索性自己做个 ...

  2. bzoj 3676: [Apio2014]回文串【回文自动机】

    回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ...

  3. Codeforces732E Sockets

    首先检测有木有和Computer匹配的Socket,如果有则将其匹配. 然后将所有没有匹配的Socket连上Adapter,再去检测有木有Computer与Socket匹配. 重复这个操作31次,所有 ...

  4. 左耳朵耗子:我为什么要在极客时间 App 开设独家专栏?

    参考链接:https://www.infoq.cn/article/2018/01/why-geektime 不少朋友都知道我在极客时间App 上开了一个收费专栏<左耳听风>,这个专栏会开 ...

  5. gcc降版本方法 - [学习]

    [转载]转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/huangw10-logs/182474992.html 周末折腾了一下午加一夜,终于弄明白 ...

  6. nginx用户统计

    1 概念 PV:页面访问量,即PageView,用户每次对网站的访问均被记录,用户对同一页面的多次访问,访问量累计. UV:独立访问用户数:即UniqueVisitor,访问网站的一台电脑客户端为一个 ...

  7. 无法获得VMCI 驱动程序的版本: 句柄无效的解决方法

    关闭虚拟机,找到安装路径,用记事本打开.vmx结尾的文件 将vmci0.present = "TRUE"改为vmci0.present = "FALSE"保存

  8. HDOJ 5475 An easy problem

    题目传送门 题意:一个计算器,两种操作,乘上x,或者除掉之前的某个x,结果取模输出 分析:因为取模不支持除法,然后比赛时想到用逆元,结果发现MOD需要与b互质,结果一直苦苦寻找求逆元的其它方法.后来队 ...

  9. Win10 Hyper-v 中安装 CentOS 搭建开发环境

    Windows 环境 操作系统:Windows 10 开发环境:VS2005(需启动.NET Framework 3.5 ,才能正常安装使用)  Linux 环境 发行版:CentOS 7_x64 安 ...

  10. win10下JDK安装,配置环境变量后报Error: could not open `C:\Program Files\Java\jre1.8.0_112\lib\amd64\jvm.cfg'

    把Path里面的%JAVA_HOME%/bin放在最前面.