题目

如果\(P>Q\)的话我们先交换一下\(P,Q\)。

我们先枚举所有满足第一个条件的数,对于\(x\equiv a_i(mod\ P)\),设\(x=a_i+kP(k\in[0,\lfloor\frac{T-a_i}P\rfloor])\)。

然后能够产生贡献的数就是\(x\%Q\in B\)的数。

而且我们知道,当\(Q|kP\)时\(x\%Q\)就会产生循环,也就是说对\(k\)而言,\(M=\frac Q{(P,Q)}\)是循环节。

所以我们可以将计算\(k\in[0,\lfloor\frac{T-a_i}P\rfloor]\)的贡献拆成\(k\in[0,M]\)和\(k\in[0,t](t\in[0,M])\)两部分。

这个贡献我们可以采用这样的方法来算:

建\(0\sim Q-1\)个点的图,\(B_i\)的权值为\(1\),其它的权值为\(0\)。并对\(x->(x+P)\%Q\)建边。

这样我们要求的就变成了从\(a_i\)出发经过\(t\)条边的经过的点权和。

易知这个图是由\((P,Q)\)个环构成的,每个环上有\(\frac Q{(P,Q)}\)个点。

所以我们处理出每个环的点权和以及环上点的点权前缀和,然后就可以计算答案了。

  1. #include<bits/stdc++.h>
  2. #define pb push_back
  3. #define ll long long
  4. using namespace std;
  5. namespace IO
  6. {
  7. char ibuf[(1<<21)+1],*iS,*iT;
  8. char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
  9. int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
  10. ll readl(){ll x=0;int c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
  11. }
  12. using namespace IO;
  13. const int N=1000007;
  14. int A[N],B[N],t[N],val[N],col[N],pos[N],P,Q;ll lim[N];vector<int>dot[N],sum[N];
  15. int dfs(int u,int num)
  16. {
  17. if(col[u]) return 0;
  18. col[u]=num,dot[col[u]].pb(u);
  19. return t[u]+dfs((u+P)%Q,num);
  20. }
  21. int cal(int x,int l){return sum[col[x]][pos[x]+l]-sum[col[x]][pos[x]];}
  22. int main()
  23. {
  24. int i,j,tmp,num=0,n,m,M;ll ans=0,T;
  25. P=read(),Q=read(),n=read(),m=read(),T=readl()-1;
  26. for(i=1;i<=n;++i) A[i]=read();
  27. for(i=1;i<=m;++i) B[i]=read();
  28. if(P>Q) swap(P,Q),swap(n,m),swap(A,B);
  29. M=Q/__gcd(P,Q);
  30. for(i=1;i<=m;++i) t[B[i]]=1;
  31. for(i=1;i<=n;++i) lim[i]=(T-A[i])/P;
  32. for(i=0;i<Q;++i) if(!col[i]) ++num,val[num]=dfs(i,num);
  33. for(i=1;i<=num;++i)
  34. {
  35. for(j=0;j<dot[i].size();++j) pos[dot[i][j]]=j;
  36. tmp=dot[i].size()-1;
  37. for(j=0;j<tmp;++j) dot[i].pb(dot[i][j]);
  38. sum[i].pb(t[dot[i][0]]);
  39. for(j=1;j<dot[i].size();++j) sum[i].pb(sum[i][j-1]+t[dot[i][j]]);
  40. }
  41. for(i=1;i<=n;++i) ans+=lim[i]/M*val[col[A[i]]]+cal(A[i],lim[i]%M)+t[A[i]];
  42. return !printf("%lld",ans);
  43. }

Luogu P5330 [SNOI2019]数论的更多相关文章

  1. 洛谷$P5330\ [SNOI2019]$数论 数论

    正解:数论 解题报告: 传送门$QwQ$ ,,,这题还蛮妙的$QwQ$(,,,其实所有数论题对我来说都挺妙的$kk$然后我真的好呆昂我理解了好久$QAQ$ 考虑先建$Q$个点,编号为$[0,Q)$,表 ...

  2. 【LOJ#3096】[SNOI2019]数论

    [LOJ#3096][SNOI2019]数论 题面 LOJ 题解 考虑枚举一个\(A\),然后考虑有多少个合法的\(B\). 首先这个数可以写成\(a_i+kP\)的形式,那么它模\(Q\)的值成环. ...

  3. 【LG5330】[SNOI2019]数论

    [LG5330][SNOI2019]数论 题面 洛谷 题目大意: 给定集合\(\mathbb {A,B}\) 问有多少个小于\(T\)的非负整数\(x\)满足:\(x\)除以\(P\)的余数属于\(\ ...

  4. [SNOI2019]数论

    题目 考虑对于每一个\(a_i\)计算有多少个\(0<x\leq T-1\)满足\(x\equiv a_i(mod\ P)\)且\(x\ mod\ Q \in B\) 显然\(x=a_i+k\t ...

  5. luogu P5371 [SNOI2019]纸牌

    传送门 打麻将+1(雾 有顺子这种东西...注意到以某个位置为开头的顺子数量最多为2,那么有个想法就是枚举以每个位置为开头的顺子个数,然后每个位置的刻子的取法个数为\(\lceil\frac{\tex ...

  6. luogu P5331 [SNOI2019]通信

    传送门 有匹配次数限制,求最小代价,这显然是个费用流的模型.每个点暴力和前面的点连匹配边,边数是\(n^2\)的. 然后发现可以转化成一个set,每次加入一个点,然后入点对set里面的出点连边.这个s ...

  7. luogu P5329 [SNOI2019]字符串

    传送门 显然要写一个排序,那只要考虑cmp函数怎么写就行了.第\(i\)个字符串和第 \(j\)个,首先前\(min(i,j)-1\)个字符是相同的,然后就是要比较后缀\(min(i,j)\)和\(m ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. luogu 1865 数论 线性素数筛法

    洛谷 1865 数论 线性素数筛法 最基本的线性素数筛法,当做复习欧拉筛法了,没有尝试过使用更暴力的筛法... WA了一次,手抖没打\n 传送门 (https://www.luogu.org/prob ...

随机推荐

  1. Tomcat的安装、配置常见问题

    (1)服务里面没有Tomcat怎么办? ——运行:cmd=>再到Tomcat 8.0/bin目录下运行: service install  即可: ——然后用: net start   Tomc ...

  2. CodeChef DGCD Dynamic GCD

    CodeChef题面 Time limit 210 ms Code length Limit //内存限制也不说一下,真是的-- 50000 B OS Linux Language limit C, ...

  3. CVPR 2018 DeepGlobe

    在刚刚结束的CVPR2018: DeepGlobe Road Extraction Challenge(全球卫星图像道路提取)比赛中,北京邮电大学信息与通信工程学院模式识别实验室张闯老师指导的研究生周 ...

  4. [BZOJ4804]欧拉心算:线性筛+莫比乌斯反演

    分析 关于这道题套路到不能再套路了没什么好说的,其实发这篇博客的目的只是为了贴一个线性筛的模板. 代码 #include <bits/stdc++.h> #define rin(i,a,b ...

  5. php GD库简单使用和封装

    GD库创建图像步骤 <?php //1.创建画布 $width = 300; $height= 200; $image=imagecreatetruecolor($width,$height); ...

  6. Maven聚合和继承

    一.建立以pom为packaging的项目为,然后再以这一个项目为parent project来聚合其他子项目         新建立一个以pom的项目 改写pom文件,依赖web-common,这样 ...

  7. 【C++进阶】 to_string,stringstream

    to_string函数主要进行以下一些参数转换为string stringstream,位于<sstream>库中 https://blog.csdn.net/jllongbell/art ...

  8. windows下eclipse打不开

    报错找不到jre等东西 因为eclipse到不到javaw.exe 将其写入eclipse.ini即可 在eclipse.ini的前面加上 -vm D:\dev_tool\java\jdk1.7.0_ ...

  9. 【linux】杀掉进程命令

    1.找到对应的进程 通过端口查找 lsof -i:端口号 netstat -tunlp | grep 端口   lsof -i:9500   netstat -tunlp | grep 9500 2. ...

  10. 阶段3 1.Mybatis_09.Mybatis的多表操作_9 mybatis多对多操作-查询用户获取用户所包含的角色信息

    sql语句以user作为主表 用户的全部信息,以为用户下的角色的.并不是所有的用户都有角色,有角色的就带角色.没角色的就为null 首先修改实体类 定义List<Role> 生成gette ...