JZOJ5258.【NOIP2017模拟8.11】友好数对

Description

Input

Output

Sample Input

3 5
1 8 13
7 5 4 8 3

Sample Output

7

Data Constraint

Hint

显然有个O(n2)的暴力枚举,不过会超时。(但也有六十分呐)

时间主要花在了一个一个判断,我们设想能否一次性判断很多个。

两个数异或后有二进制中有两个一,就是说两个数二进制下有两位是不同的,即有ai xor 2k xor bj xor 2l=0(k!=l);

那么我们可以考虑枚举ai xor 2k,丢到hash表里,然后再枚举每个bj xor 2l,在hash里找是否有相等的。

为避免重复(ai xor 2k   bj xor 2l 与 ai xor 2l  bj xor 2k是相等的),我们可以令k<l。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #define mo 9999999
 8 #define N 100005
 9 int n,hash[mo],m,a[N],b[N],g[mo],qwq[31];
10 long long ans;
11 void init(int x){
12     int a=x%mo;
13     while ((hash[a]!=0)&&(hash[a]!=x)) a=(a+1)%mo;
14     hash[a]=x;
15     g[a]++;
16 }
17 int get(int x){
18     int a=x%mo;
19     while ((hash[a]!=0)&&(hash[a]!=x)) a=(a+1)%mo;
20     return g[a];
21 }
22 int main(){
23     scanf("%d%d",&n,&m);
24     for (int i=1;i<=n;i++)
25      scanf("%d",&a[i]);
26     for (int j=1;j<=m;j++)
27      scanf("%d",&b[j]);
28     qwq[0]=1;
29     for (int i=1;i<=30;i++)
30      qwq[i]=2*qwq[i-1];
31     for (int i=1;i<=n;i++)
32      init(a[i]^qwq[0]);
33     ans=0;
34     for (int i=1;i<30;i++){
35         for (int j=1;j<=m;j++)
36          ans+=get(b[j]^qwq[i]);
37         for (int j=1;j<=n;j++)
38          init(a[j]^qwq[i]);
39     }
40     printf("%lld\n",ans);
41 }

神奇的代码

时间: 2024-08-25 21:29:16

JZOJ5258.【NOIP2017模拟8.11】友好数对的相关文章

JZOJ5257.【NOIP2017模拟8.11】小X的佛光

Description Input Output Sample Input 3 3 1 1 2 2 3 1 2 3 1 1 3 3 1 3 Sample Output 1 1 3 Data Constraint 题目就是要求两点到一个点的路径中重叠的点的个数. 特殊性质一是一条链,我们可以通过讨论两个起点和一个终点的相对位置直接得出答案. 特殊性质二的两个起点相同,就是要我们求树上两点之间的点的个数,求出两点LCA,预处理点到根节点的距离,再根据LCA是不是根节点决定距离相减或相加就可以了. 考

[coci2011]友好数对 容斥

无趣的小x在玩一个很无趣的数字游戏.他要在n个数字中找他喜欢友好数对.他对友好数对的定义是:如果有两个数中包含某一个以上相同的数位(单个数字),这两个数就是友好数对.比如:123和345 就是友好数对,因为都包含数位3,显然123和234也是由号数对.而12和34则不是友好数对,因为它们没有相同的数位. 刚拿到题没怎么读懂,因为我直观的想法是存一下扫一遍就行了,后来一想,得用容斥:又犯蠢了: 其实这道题的容斥比较基本,看代码吧: #include<iostream> #include<c

蓝桥杯 算法训练 ALGO-117 友好数

算法训练 友好数 时间限制:1.0s   内存限制:256.0MB 问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284 284的约数和有:1 2 4 71 142=220 所以220和284是友好的. 编写程序,判断两个数是否是友好数. 输入格式 一行,两个整数,由空格分隔 输出格式 如

1105 判断友好数对

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1105Description输入两个正整数m和n,顺序输出m到n之间的所有友好数对.如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的.例如:1184和1210是友好数对,因为 1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=1210 1210的因子之和为1+2+5+10+11+22+55+110+121+242+605=1

【数论】【枚举约数】【友好数】CODEVS 2632 非常好友

O(sqrt(n))枚举约数,根据定义暴力判断友好数. 1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 int n; int limit; 5 int main() 6 { 7 scanf("%d",&n); 8 for(;;n++) 9 { 10 limit=sqrt(n); int tot=1; 11 if(limit*limit==n) tot+=limit; 12 for

1105: 判断友好数对(函数专题)

题目描述 输入两个正整数m和n,顺序输出m到n之间的所有友好数对. 如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的.例如:1184和1210是友好数对,因为 1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=1210 1210的因子之和为1+2+5+10+11+22+55+110+121+242+605=1184 要求程序定义一个facsum ()函数和一个main()函数,facsum ()函数计算并返回n的所有正因子之和,其余

zzuli oj 1105 友好数对

题意描述:输入两个正整数m和n,顺序输出m到n之间的所有友好数对. 如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的.例如:1184和1210是友好数对解题思路:编写函数计算出m-n每个整数的所有正因子之和,然后利用函数算出该因子和的因子和是否等于该数本身,输出原整数与其因子和.代码实现: 1 #include<stdio.h> 2 int facsum(int n) 3 { 4 int i,sum=0; 5 for(i=1;i<n;i++) 6 { 7 i

Cisco PT模拟实验(11) 路由器单臂路由配置

Cisco PT模拟实验(11) 路由器单臂路由配置 实验目的: 掌握单臂路由的配置方法 实现不同VLAN之间互相通信 深入理解VLAN通信原理及路由子接口 实验背景: 公司的技术部和销售部分处于不同的办公室,技术部和销售部的PC分处于不同的VLAN,现由于业务的需求需要销售部和技术部的主机能够相互访问,获得相应的资源,两个部门的交换机通过一台路由器进行了连接. 技术原理: VLAN能有效分割局域网,实现各网络区域之间的访问控制.但现实中,往往需要配置某些VLAN之间的互联互通.而实现不同VLA

nyist 11 奇偶数分离

奇偶数分离时间限制:3000 ms | 内存限制:65535 KB 难度:1描述 有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再把所有的偶数从小到大输出.输入第一行有一个整数i(2<=i<30)表示有 i 组测试数据:每组有一个整型偶数n.输出第一行输出所有的奇数第二行输出所有的偶数 样例输入21014样例输出1 3 5 7 9 2 4 6 8 10 1 3 5 7 9 11 13 2 4 6 8 10 12 14 #includ