洛谷 P3868 [TJOI2009]猜数字【中国剩余定理】
思路
中国剩余定理 + 快速乘
题目要求找到最小的 n ∈ N n\in \N n∈N,满足对于 ∀ i ∈ [ 1 , k ] \forall i\in [1,k] ∀i∈[1,k],有 b i ∣ ( n − a i ) b_i | (n-a_i) bi∣(n−ai)
我们试着来转化一下这个式子
b i ∣ ( n − a i ) b_i|(n-a_i) bi∣(n−ai),也就是说 ( n − a i ) (n-a_i) (n−ai)在模 b i b_i bi意义下同余 0 0 0,即 n − a i ≡ 0 ( mod b i ) n - a_i\equiv 0(\text{mod}\ b_i) n−ai≡0(mod bi),进一步转化,就能得到 n ≡ a i ( mod b i ) n\equiv a_i(\text{mod}\ b_i) n≡ai(mod bi)
这个式子是不是很眼熟?没错,就是中国剩余定理的式子,因为题目中已经保证了 b i b_i bi两两互素,所以我们就可以直接套中国剩余定理的板子了
设 N = ∏ i = 1 n b i N=\prod_{i=1}^nb_i N=∏i=1nbi, M i = N / b i Mi=N/b_i Mi=N/bi, x i x_i xi是线性同余方程 M i x i ≡ 1 ( mod b i ) M_ix_i≡1(\text{mod}\ b_i) Mixi≡1(mod bi)的一个解(即 M i Mi Mi的逆元),最后的解即为 a n s = ∑ i = 1 k a i M i x i ans=\sum\limits_{i=1}^ka_iM_ix_i ans=i=1∑kaiMixi
那么这样就完了嘛?
此题终结其实不然
这样交上去之后,会发现只有九十分,最后一个点 W A WA WA了,因为这题要用快速乘,于是写上快速乘
那么这样就完了嘛?
此题终结其实也不然
又交上去之后,发现还是九十分,不过这次错的点是第二个了。
这是为什么呢?
看题目条件: ∣ a i ∣ ≤ 1 0 9 ∣a_i∣≤10^9 ∣ai∣≤109
什么意思呢?意思就是 a i a_i ai可能是负的!(出题人真是用心良苦
处理的方法就是:快速乘传参时取模
那么这样就完了嘛?
兴冲冲的交上去,终于满分了,没错,这次真完了
代码
/*
Author:loceaner
中国剩余定理板子题
*/
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;const int A = 5e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;inline int read() {char c = getchar(); int x = 0, f = 1;for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;for( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);return x * f;
}int n, N = 1, b[A], a[A], ans;inline int mul(int n, int m, int mod) {int res = 0;while (m) {if (m & 1) res = (res + n) % mod;n = (n + n) % mod, m >>= 1;}return res;
}inline void exgcd(int a, int b, int &x, int &y) {if (!b) x = 1, y = 0;else exgcd(b, a % b, y, x), y -= a / b * x;
}signed main() {n = read();for (int i = 1; i <= n; i++) a[i] = read();for (int i = 1; i <= n; i++) b[i] = read(), N *= b[i];for (int i = 1; i <= n; i++) {int x, y, Mi = N / b[i];exgcd(Mi, b[i], x, y);ans = (ans + mul(mul(Mi, x % N + N, N), a[i] % N + N, N) % N + N) % N; }cout << ans % N << '\n';return 0;
}
洛谷 P3868 [TJOI2009]猜数字【中国剩余定理】相关推荐
- P3868 [TJOI2009]猜数字
传送门 中国剩余定理模板题(关于中国剩余定理,我是在这里学的:传送门) 由题可知: n-ai=k*bi ---> n-ai ≡ 0 (mod bi) ---> n≡ai (mod ...
- P3868 [TJOI2009]猜数字(CRT板子)
题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- [TJOI2009] 猜数字
传送门:>Here< 题意:中国剩余定理 解题思路 本来想练CRT模板的,就不多说了.结果莫名被最后一个点卡成负数.我开long long了? 原来是要快速乘.蒟蒻从没用过快速乘,因此学习 ...
- 洛谷——P1427 小鱼的数字游戏
P1427 小鱼的数字游戏 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a_ia**i(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了) ...
- 数组——洛谷#P1427 小鱼的数字游戏(Python实现)
题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的 ...
- 洛谷[P1427]小鱼的数字游戏
题目传送门OvO 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过 2 32 − 1 2^{32}-1 232−1),记住了然后反 ...
- 洛谷(小鱼的数字游戏、进制转换、Cableway、Quasi Binary)
小鱼的数字游戏: 代码: #include<iostream> #include<cstring> #include<algorithm> using namesp ...
- 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演
求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...
最新文章
- Shell基础命令之echo
- 查看MYSQL数据库中所有用户及拥有权限
- JavaIO流(2)--IO流原理、流的分类及节点流文件流操作
- python安装mysqlclient_Python-安装mysqlclient(MySQLdb)
- C++学习之路 | PTA乙级—— 1001 害死人不偿命的(3n+1)猜想 (15分)(精简)
- jupyter 无法提示代码,报错TypeError: __init__() got an unexpected keyword argument ‘column‘
- 苹果AirPods有望在年末推出新款产品 或将支持防水功能
- 60-100-340-使用-DataSource-hive相关-Flink加载hive数据源
- 时尚精美电商专题首页设计PSD分层模板资源
- 解决Element的 InfiniteScroll 无限滚动组件报错
- java编程题50道
- XP系统服务启动设置优化
- android room 简书,android Room库使用问题
- 学校计算机房电脑桌,学校机房用双机位电脑桌的制作方法
- 在Unity中实现简单的动画转场
- 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
- Java word转pdf 精确获取文件页数(jacob)
- 专业的个人记帐软件 爱上记帐 1.0.1
- 统计中的f检验和t检验的区别
- 启动rabbitmq,遇到发生系统错误2和发生系统错误5的解决方法