题目

考虑对于每一个\(a_i\)计算有多少个\(0<x\leq T-1\)满足\(x\equiv a_i(mod\ P)\)且\(x\ mod\ Q \in B\)

显然\(x=a_i+k\times P\),先考虑一下这个\(k\)最大能取到多少,显然有\(a_i+k\times P\leq T-1\),所以\(k\)最大取到\(\left \lfloor \frac{T-1-a_i}{P} \right \rfloor\)

我们这样加下去,肯定会使得\(x\)在\(mod\ Q\)意义下循环,我们尝试利用一下这个循环的性质

一旦\(k\times P\equiv 0(mod\ Q)\)就会循环,显然\(k=\frac{lcm(P,Q)}{P}=\frac{Q}{gcd(P,Q)}\)就是最小循环节

再考虑把这个问题转化成一个图论问题,我们对于每一个\(0<x<Q\),都建一条向\((x+P)\% Q\)的边,属于\(B\)集合中的点的点权是\(1\),我们要做的是求出每一个\(a_i\)走\(\left \lfloor \frac{T-1-a_i}{P} \right \rfloor\)步到达的点的点权和

由于每一个点只有一条出边,那么就说明这个图里只会存在一些简单环,而且每一个环的大小都是\(\frac{Q}{gcd(P,Q)}\)

于是现在我们就可以把每一个环都找出来,维护一下每一个环的点权和,再维护一下环的前缀和,这样我们就能快速计算每一个点走一定步数到达的点的点权和了

边界情况需要好好判断一下

代码

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define re register
  4. const int maxn = 1e6 + 5;
  5. LL T, ans, p[maxn];
  6. std::vector<int> s[maxn], v[maxn];
  7. int len, P, Q, n, m, a[maxn], b[maxn], tax[maxn], w[maxn], col[maxn], pos[maxn], num;
  8. inline int read() {
  9. char c = getchar();int x = 0;
  10. while (c < '0' || c > '9') c = getchar();
  11. while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - 48, c = getchar();
  12. return x;
  13. }
  14. int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
  15. int dfs(int x, int c) {
  16. if (col[x]) return 0;
  17. col[x] = c;
  18. v[col[x]].push_back(x);
  19. return tax[x] + dfs((x + P) % Q, c);
  20. }
  21. inline int find(int l, int x) { return s[col[x]][pos[x] + l] - s[col[x]][pos[x]]; }
  22. int main() {
  23. P = read(), Q = read(), n = read(), m = read(), scanf("%lld", &T);
  24. for (re int i = 1; i <= n; i++) a[i] = read();
  25. for (re int i = 1; i <= m; i++) b[i] = read();
  26. if (P > Q)
  27. std::swap(P, Q), std::swap(n, m), std::swap(a, b);
  28. len = Q / gcd(P, Q);
  29. for (re int i = 1; i <= m; i++) tax[b[i]] = 1;
  30. for (re int i = 1; i <= n; i++) p[i] = (T - 1 - a[i]) / P;
  31. for (re int i = 0; i < Q; i++)
  32. if (!col[i])
  33. ++num, w[num] = dfs(i, num);
  34. for (re int i = 1; i <= num; i++) {
  35. for (re int j = 0; j < v[i].size(); j++) pos[v[i][j]] = j;
  36. int t = v[i].size() - 1;
  37. for (re int j = 0; j < t; j++) v[i].push_back(v[i][j]);
  38. s[i].push_back(tax[v[i][0]]);
  39. for (re int j = 1; j < v[i].size(); j++) s[i].push_back(s[i][j - 1] + tax[v[i][j]]);
  40. }
  41. for (re int i = 1; i <= n; i++) {
  42. ans += 1ll * (p[i] / len) * (w[col[a[i]]]);
  43. ans += find(p[i] % len, a[i]) + tax[a[i]];
  44. }
  45. printf("%lld\n", ans);
  46. return 0;
  47. }

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

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

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

  2. 【LG5330】[SNOI2019]数论

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

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

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

  4. Luogu P5330 [SNOI2019]数论

    题目 如果\(P>Q\)的话我们先交换一下\(P,Q\). 我们先枚举所有满足第一个条件的数,对于\(x\equiv a_i(mod\ P)\),设\(x=a_i+kP(k\in[0,\lflo ...

  5. Loj #3096. 「SNOI2019」数论

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

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

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

  7. [日常] SNOI2019场外VP记

    SNOI2019场外VP记 教练突然说要考一场别省省选来测试水平...正好还没看题那就当VP咯w... Day 1 八点开题打 .vimrc. 先看了看题目名...一股莫名鬼畜感袭来... 怎么T1就 ...

  8. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

  9. NOIP2014 uoj20解方程 数论(同余)

    又是数论题 Q&A Q:你TM做数论上瘾了吗 A:没办法我数论太差了,得多练(shui)啊 题意 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, ...

随机推荐

  1. Java调用未被Static修饰的本类方法

    public class Dy { public static void main(String[] args){ int a=6; int b=5; int result=0; Dy dy=new ...

  2. mysqlerror2003错误原因以及解决方案

    出现mysql #2003错误有一下几种原因 一.mysql数据库没有启动 这种情况也正是我遇到的,到windows服务选项里查看发现没有mysql数据库服务这个选项,记得刚开始安装mysql的时候是 ...

  3. 阿里云RDS数据库备份文件恢复到本地mysql数据库

    一.安装mysql和xtrabackup  (1)安装mysql 因为RDS是5.6版本,所以我们本地的mysql数据库要与RDS版本对应. rpm -ivh http://repo.mysql.co ...

  4. (水题)洛谷 - P1553 - 数字反转(升级版) - 字符串格式转换

    https://www.luogu.org/problemnew/show/P1553 忘记给整数加上前导零去除的代码了.其实不去也可以,额外的进位用一个carry另外存起来就好. #include& ...

  5. bzoj1485: [HNOI2009]有趣的数列(Catalan数)

    1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2105  Solved: 1117[Submit][Stat ...

  6. TensorFlow多线程输入数据处理框架(四)——输入数据处理框架

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 输入数据处理的整个流程. #!/usr/bin/env python # -*- coding: UTF-8 -* ...

  7. LookupError: unknown encoding: idna 的处理方法

    写了一个脚本,想把它打包成exe文件,在python编译器中运行正常,但是打包成.exe文件运行报错 LookupError: unknown encoding: idna 找遍资料终于找到了解决方法 ...

  8. OkHttp下载文件中途断网报Can't create handler inside thread that has not called Looper.prepare()异常的解决办法

    最近做项目时出现个问题. 在一个基类中,创建一个Handler对象用于主线程向子线程发送数据,代码如下: this.mThirdHandler = new Handler(){ @Override p ...

  9. javaFx 学习笔记

    1.每个javaFx程序定义在一个继承自javafx.application.Application的类中 Button:用于设置一个按钮,Button btOK = new Button(" ...

  10. 爬虫中动态的POST参数

    爬虫的过程中,有的网站提交POST数据时候每次都会带上不懂POST参数,要想爬到数据首先的知道怎么构造这些动态的参数. 1.分析提交POST数据的最原始网页,分析原始网页的源代码,查找里面是否包含有你 ...