Description

Input

第一行输入一个正整数T(T<=85),表示测试数据的组数。
每组数据第一行包含两个正整数n,m(1<=n,m<=2000),表示序列的长度。
第二行包含n个正整数,表示a[0],a[1],...,a[n-1](0<=a[i]<=1000000)。
第三行包含m个正整数,表示b[0],b[1],...,b[m-1](0<=b[i]<=1000000)。

Output

对于每组数据输出一行一个整数,即答案。

Sample Input

3
3 2
5 9 6
3 4
2 2
8 9
0 6
1 1
9
6

Sample Output

6
22
3
 
传说中的O(n)-O(1)求gcd算法。
这个算法基于这样一个定理:
对于一个正整数x,x一定可以分解成x1*x2*x3的形式。其中xi满足要么小于等于sqrt(x),要么是一个素数。

然后整个算法分为两步:
1.预处理出1到N所有数的分解式与1到sqrt(N)内两两数的gcd。
2.对于每个x,y,O(1)回答gcd(x,y)。
 
预处理过程
预处理1到sqrt(N)内两两数的gcd可以递推。
预处理1到N所有数的分解式的话可以线性筛弄出每个数x最小的质因子p,再根据p的分解式得到x的分解式。
 
询问过程
因为xi要么<=sqrt(N)要么是一个素数,根据这个性质就可以写出代码:
int SIZE=(int)sqrt(N);
int ans=1,d;
for(int i=0;i<3;i++) {
if(x[i]<=SIZE) d=gcd[x[i]][y%x[i]];
else if(y%x[i]==0) d=x[i];
else d=1;
ans=ans*d;y=y/d;
}

正确性显然。

全代码:

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1000010;
int g[1010][1010],d[maxn],pri[maxn/10],cnt;
bool vis[maxn];
int A[maxn],B[maxn],C[maxn];
void init(int n) {
rep(i,0,1005) rep(j,0,i) {
if(!i||!j) g[i][j]=i+j;
else g[i][j]=g[j][i%j];
}
rep(i,0,1005) rep(j,i+1,1005) g[i][j]=g[j][i];
d[1]=1;
rep(i,2,n) {
if(!vis[i]) pri[++cnt]=i,d[i]=i;
rep(j,1,cnt) {
if(i*pri[j]>n) break;
vis[i*pri[j]]=1;
if(i%pri[j]==0) {d[i*pri[j]]=d[i];break;}
d[i*pri[j]]=pri[j];
}
}
A[1]=B[1]=C[1]=1;
rep(i,2,n) {
int j=i/d[i];A[i]=A[j];B[i]=B[j];C[i]=C[j];
if(A[i]*d[i]<=1000) A[i]*=d[i];
else if(B[i]*d[i]<=1000) B[i]*=d[i];
else C[i]*=d[i];
}
}
int X[3];
int gcd(int x,int y) {
if(!x||!y) return x+y;
if(x<=1000&&y<=1000) return g[x][y];
int c=0;
if(A[x]!=1) X[c++]=A[x];
if(B[x]!=1) X[c++]=B[x];
if(C[x]!=1) X[c++]=C[x];
int ans=1,d;
rep(i,0,c-1) {
if(X[i]<=1000) d=g[X[i]][y%X[i]];
else if(y%X[i]==0) d=X[i];
else d=1;
ans*=d;y/=d;
}
return ans;
}
int n,m,a[2010],b[2010];
int main() {
init(1000000);
dwn(T,read(),1) {
n=read();m=read();unsigned int ans=0;
rep(i,0,n-1) a[i]=read();
rep(i,0,m-1) b[i]=read();
rep(i,0,n-1) rep(j,0,m-1) ans+=gcd(a[i],b[j])^i^j;
printf("%u\n",ans);
}
return 0;
}

  

 

BZOJ4454: C Language Practice的更多相关文章

  1. BZOJ 4454: C Language Practice

    4454: C Language Practice Time Limit: 20 Sec  Memory Limit: 24 MBSubmit: 501  Solved: 112[Submit][St ...

  2. 英语口语考试资料Language learning

    "Learning a language is easy. Even a child can do it!" Most adults who are learning a seco ...

  3. 100 天从 Python 新手到大师

    Python应用领域和就业形势分析 简单的说,Python是一个“优雅”.“明确”.“简单”的编程语言. 学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. Python - 100天从新手到大师

    简单的说,Python是一个“优雅”.“明确”.“简单”的编程语言. 学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支持面向对象和函数式编程 能够通过调用 ...

  6. 国内某Python大神自创完整版,系统性学习Python

    很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...

  7. 课程五(Sequence Models),第二 周(Natural Language Processing & Word Embeddings) —— 0.Practice questions:Natural Language Processing & Word Embeddings

    [解释] The dimension of word vectors is usually smaller than the size of the vocabulary. Most common s ...

  8. The 11 advantages of Java -Why you choose this language

    Java is never just a language.There are lots of programming languages out there, and few of them mak ...

  9. Microsoft source-code annotation language (SAL) 相关

    More info see: https://msdn.microsoft.com/en-us/library/hh916383.aspx Simply stated, SAL is an inexp ...

随机推荐

  1. “init terminating in do_boot” Windows10 Rabbit MQ fails to start

    在Windows 10环境下安装rabbitmq-server-3.6.2后,CMD中运行命令:rabbitmq-plugins enable rabbitmq_management 报错: { , ...

  2. Oracle RMAN备份策略

    建立增量备份:如果数据库运行于不归档模式下,只能在数据库干净关闭的情况下 ( 以 normal .immediate . transactional 方式关闭 ) 才能进行一致性的增量备份,如果数据库 ...

  3. myeclipse+tomcat 工程名改名的问题 ——————完美解决方案

    当建好的工程再重命名之后,发布和访问的时候都还是原来的名字,这个问题纠结了我很久,最好找到解决方法,这里分享一下,希望大家不要再受这种困惑.解决方法: 点击工程右键->properties-&g ...

  4. 注解:【有连接表的】Hibernate单向N->1关联

    Person与Address关联:单向N->1,[有连接表的] Person.java package org.crazyit.app.domain; import javax.persiste ...

  5. Get open Popups

    public IEnumerable<Popup> GetOpenPopups() { return PresentationSource.CurrentSources.OfType< ...

  6. hdu 4114(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...

  7. 利用canvas实现抽奖转盘---转载别人的

    功能需求 转盘要美观,转动效果流畅. 转盘上需要显示奖品图片,并且奖品是后台读取的照片和名字. 转动动画完成后要有相应提示. 获取的奖品具体算法在数据库里操作,前端只提供最后的效果展示.   知识要点 ...

  8. AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  9. Centos系统上安装VNC view

    一.安装 VNC 默认情况下,CentOS 6.4 是没有安装的,检查是否安装,输入: [root@localhost ~]# rpm -q vnc vnc-server package vnc is ...

  10. cvKMeans2函数用法概述

    一般情况下,我们通过C++/Matlab/Python等语言进行实现K-means算法,结合近期我刚刚学的C++,先从C++实现谈起,C++里面我们一般采用的是OpenCV库中写好的K-means函数 ...