[SNOI2019]数论
考虑对于每一个\(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)}\)
于是现在我们就可以把每一个环都找出来,维护一下每一个环的点权和,再维护一下环的前缀和,这样我们就能快速计算每一个点走一定步数到达的点的点权和了
边界情况需要好好判断一下
代码
#include <bits/stdc++.h>
#define LL long long
#define re register
const int maxn = 1e6 + 5;
LL T, ans, p[maxn];
std::vector<int> s[maxn], v[maxn];
int len, P, Q, n, m, a[maxn], b[maxn], tax[maxn], w[maxn], col[maxn], pos[maxn], num;
inline int read() {
char c = getchar();int x = 0;
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - 48, c = getchar();
return x;
}
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
int dfs(int x, int c) {
if (col[x]) return 0;
col[x] = c;
v[col[x]].push_back(x);
return tax[x] + dfs((x + P) % Q, c);
}
inline int find(int l, int x) { return s[col[x]][pos[x] + l] - s[col[x]][pos[x]]; }
int main() {
P = read(), Q = read(), n = read(), m = read(), scanf("%lld", &T);
for (re int i = 1; i <= n; i++) a[i] = read();
for (re int i = 1; i <= m; i++) b[i] = read();
if (P > Q)
std::swap(P, Q), std::swap(n, m), std::swap(a, b);
len = Q / gcd(P, Q);
for (re int i = 1; i <= m; i++) tax[b[i]] = 1;
for (re int i = 1; i <= n; i++) p[i] = (T - 1 - a[i]) / P;
for (re int i = 0; i < Q; i++)
if (!col[i])
++num, w[num] = dfs(i, num);
for (re int i = 1; i <= num; i++) {
for (re int j = 0; j < v[i].size(); j++) pos[v[i][j]] = j;
int t = v[i].size() - 1;
for (re int j = 0; j < t; j++) v[i].push_back(v[i][j]);
s[i].push_back(tax[v[i][0]]);
for (re int j = 1; j < v[i].size(); j++) s[i].push_back(s[i][j - 1] + tax[v[i][j]]);
}
for (re int i = 1; i <= n; i++) {
ans += 1ll * (p[i] / len) * (w[col[a[i]]]);
ans += find(p[i] % len, a[i]) + tax[a[i]];
}
printf("%lld\n", ans);
return 0;
}
[SNOI2019]数论的更多相关文章
- 【LOJ#3096】[SNOI2019]数论
[LOJ#3096][SNOI2019]数论 题面 LOJ 题解 考虑枚举一个\(A\),然后考虑有多少个合法的\(B\). 首先这个数可以写成\(a_i+kP\)的形式,那么它模\(Q\)的值成环. ...
- 【LG5330】[SNOI2019]数论
[LG5330][SNOI2019]数论 题面 洛谷 题目大意: 给定集合\(\mathbb {A,B}\) 问有多少个小于\(T\)的非负整数\(x\)满足:\(x\)除以\(P\)的余数属于\(\ ...
- 洛谷$P5330\ [SNOI2019]$数论 数论
正解:数论 解题报告: 传送门$QwQ$ ,,,这题还蛮妙的$QwQ$(,,,其实所有数论题对我来说都挺妙的$kk$然后我真的好呆昂我理解了好久$QAQ$ 考虑先建$Q$个点,编号为$[0,Q)$,表 ...
- Luogu P5330 [SNOI2019]数论
题目 如果\(P>Q\)的话我们先交换一下\(P,Q\). 我们先枚举所有满足第一个条件的数,对于\(x\equiv a_i(mod\ P)\),设\(x=a_i+kP(k\in[0,\lflo ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- 【LOJ】#3096. 「SNOI2019」数论
LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...
- [日常] SNOI2019场外VP记
SNOI2019场外VP记 教练突然说要考一场别省省选来测试水平...正好还没看题那就当VP咯w... Day 1 八点开题打 .vimrc. 先看了看题目名...一股莫名鬼畜感袭来... 怎么T1就 ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
- NOIP2014 uoj20解方程 数论(同余)
又是数论题 Q&A Q:你TM做数论上瘾了吗 A:没办法我数论太差了,得多练(shui)啊 题意 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, ...
随机推荐
- EasyUI 表格点击右键添加或刷新 绑定右键菜单
例1 在HTML页面中设置一个隐藏的菜单(前提是已经使用封装的Easyui) 代码: <div id="contextMenu_jygl" class="easyu ...
- 关于 GraPhlAn 的孤独自学
最近需要用 GraPhlan 来绘制 taxo分类图,稍微研究了一下 一.简介 官网: http://huttenhower.sph.harvard.edu/GraPhlAn 主要有两个脚本: gra ...
- Node学习图文教程之express重写留言本案例
写在前面 小伙伴们大家好,我是你们的pubdreamcc,接着前面的学习,这篇博文出至于我的GitHub仓库:Node学习教程资料,如果你觉得对你有帮助,欢迎star,你们的点赞是我持续更新的动力,谢 ...
- HDU4467:Graph(点的度数分块)
传送门 题意 给出一张n个点m条边的无向图,点的颜色为0/1,每次有两种操作: 1.Asksum x y,查询两点颜色为x和y的边的权值之和 2.Change x,将x颜色取反 分析 最直接的做法是每 ...
- 51nod 1094 【水题】
暴力即可!!! #include <stdio.h> #include <string.h> #include <iostream> using namespace ...
- hdoj5667 BestCoder Round #80 【费马小定理(膜拜)+矩阵快速幂+快速幂】
#include<cstdio> #include<string> #include<iostream> #include<vector> #inclu ...
- python __builtins__ str类 (65)
65.'str', 字节转换成字符串.第一个传入参数是要转换的字节,第二个参数是按什么编码转换成字符串 class str(object) | str(object='') -> str | s ...
- BERT的几个可能的应用
BERT是谷歌公司于2018年11月发布的一款新模型,它一种预训练语言表示的方法,在大量文本语料(维基百科)上训练了一个通用的"语言理解"模型,然后用这个模型去执行想做的NLP ...
- new delete 创建回收细节
- AtCoder Regular Contest 083 E - Bichrome Tree
题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...