Loj #3096. 「SNOI2019」数论

题目描述

给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出:

\[\sum_{i=0}^{T-1} [(i\in A\pmod P)\land(i\in B\pmod Q)]
\]

换言之,就是问有多少个小于 \(T\) 的非负整数 \(x\) 满足:\(x\) 除以 \(P\) 的余数属于 \(A\) 且 \(x\) 除以 \(Q\) 的余数属于 \(B\)。

输入格式

第一行 \(5\) 个用空格隔开的整数 \(P,Q,n,m,T\)。

第二行 \(n\) 个用空格隔开的整数,表示集合 \(A=\{A_1,A_2,\dots ,A_n\}\)。保证 \(A_i\) 两两不同,且 \(0 \le A_i < P\)。

第三行 \(m\) 个用空格隔开的整数,表示集合 \(B=\{B_1,B_2,\dots ,B_m\}\)。保证 \(B_i\) 两两不同,且 \(0 \le B_i < Q\)。

输出格式

输出一行一个整数表示答案。

数据范围与提示

对于所有数据,\(1 \le n, m \le 10^6, 1 \le P, Q \le 10^6, 1 \le T \le 10^{18}\)。

* 对于 \(10\%\) 的数据,\(T \le 10^6\)。

* 对于另外 \(20\%\) 的数据,\(P, Q \le 1000\)。

* 对于另外 \(10\%\) 的数据,\(T\) 是 \(P, Q\) 的公倍数。

* 对于另外 \(10\%\) 的数据,\(P, Q\) 互质,且 \(P,Q \le 10^5\)。

* 对于另外 \(10\%\) 的数据,\(P, Q\) 互质。

\(\\\)

考虑枚举\(a_i\),然后计算有多少个\(x\)满足\(x\%P =a_i\)且\(x\%Q\in B\)。

首先\(x\)可以表示为\(a_i+P*t\),然后\((a_i+P*t)\%Q\)是有循环的。具体来说是\(\gcd(P,Q)\)个长为\(\frac{Q}{\gcd(P,Q)}\)的环。知道这个过后就很好做了。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 1000005 using namespace std;
inline ll Get() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} ll P,Q,T;
ll ans;
int n,m;
int a[N],b[N];
ll gcd(ll a,ll b) {return !b?a:gcd(b,a%b);}
ll lcm;
int sum[N];
bool vis[N];
int pre[N],tot[N];
int cir;
bool key[N];
int rk[N];
int main() {
P=Get(),Q=Get(),n=Get(),m=Get(),T=Get();
cir=Q/gcd(P,Q);
for(int i=1;i<=n;i++) a[i]=Get();
for(int i=1;i<=m;i++) {
b[i]=Get(),sum[b[i]]++;
key[b[i]]=1;
}
for(int i=0;i<Q;i++) {
if(vis[i]) continue ;
vis[i]=1;
int now,last=i;
rk[i]=1;
for(now=(last+P)%Q;now!=i;last=now,now=(now+P)%Q) {
rk[now]=rk[last]+1;
sum[now]+=sum[last];
vis[now]=1;
}
tot[i]=sum[last];
for(int j=(i+P)%Q;j!=i;j=(j+P)%Q) tot[j]=sum[last];
}
for(int i=1;i<=n;i++) {
if(a[i]>=T) continue ;
ll lim=(T-1-a[i])/P;
ll A=a[i]%Q,B=(A+lim%cir*P)%Q;
ans+=lim/cir*tot[A];
if(rk[A]<=rk[B]) ans+=sum[B]-sum[A]+key[A];
else ans+=tot[A]-(sum[A]-sum[B]-key[A]);
}
cout<<ans;
return 0;
}

Loj #3096. 「SNOI2019」数论的更多相关文章

  1. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  2. 【LOJ】#3098. 「SNOI2019」纸牌

    LOJ#3098. 「SNOI2019」纸牌 显然选三个以上的连续牌可以把他们拆分成三个三张相等的 于是可以压\((j,k)\)为有\(j\)个连续两个的,有\(k\)个连续一个的 如果当前有\(i\ ...

  3. 【LOJ】#3097. 「SNOI2019」通信

    LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...

  4. 【LOJ】#3095. 「SNOI2019」字符串

    LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i ...

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

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

  6. LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)

    题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  9. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

随机推荐

  1. Windows Server 2016-MS服务器应用程序兼容性列表

    该表罗列支持 Window Server 2016 上安装和功能的 Microsoft 服务器应用程序. 此信息用于快速参考,不用于替代有关单个产品的规格.要求.公告或每个服务器应用程序的常规通信的说 ...

  2. 【English】20190429

    detect发现 [dɪˈtekt] charger充电器 [ˈtʃɑːrdʒər] unable to detect charger

  3. 微信小程序中转义字符的处理

    在微信小程序开发过程中,有时候会用到常用的一些特殊字符如:‘<’.‘>’.‘&’.‘空格’等,微信小程序同样支持对转义字符的处理,下面提供两种方法用来处理微信小程序中转义字符的处理 ...

  4. Markdown 插入图片技巧

    在使用Markdown编写博客或文件的时候,经常会需要插入图片.如果使用Markdown语法,我们会发现调整图片的大小会是个问题. 所以推荐使用另一种办法插入图片,使用HTML语法,示例如下: < ...

  5. javascript对象和数组之 深拷贝和浅拷贝

    管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家. 首先要知道什么是深拷贝?什么是浅拷贝? 深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外 ...

  6. ubuntu 16.04安装perf

    ljc@ubuntu:~$ perf 程序“perf”尚未安装. 您可以使用以下命令安装: sudo apt install linux-tools-common ljc@ubuntu:~$ sudo ...

  7. CentOS7 安装mysql 5.7

    一.安装准备 检查系统中是否安装了mysqlrpm -qa|grep mysql如果有安装mysql,则需要先卸载之前安装的mysqlyum -y remove mysql然后再查看mysql是否都卸 ...

  8. python2到python3代码转化:2to3

    Mac系统上: 安装完python3后,2to3可以作为指令直接执行,-w代表"Write back modified files","."代表当前整个文件夹, ...

  9. .NET Core微服务之服务间的调用方式(REST and RPC)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.REST or RPC ? 1.1 REST & RPC 微服务之间的接口调用通常包含两个部分,序列化和通信协议.常见的序列化 ...

  10. 【Android Studio安装部署系列】十九、Android studio使用SVN

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在AndroidStudio中开发版本控制,除了Git就是SVN,和Eclipse不同,Android Studio没有提供单独的插 ...