[TJOI2009]猜数字
题目描述
现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示。其中第二组中的数字是两两互素的。求最小的非负整数n,满足对于任意的i,n - ai能被bi整除。
输入输出格式
输入数据的第一行是一个整数k,(1 ≤ k ≤ 10)。接下来有两行,第一行是:a1,a2,...,ak,第二行是b1,b2,...,bk
输出所求的整数n。
也就是求出n,让n满足bi|n-ai。我们将式子转化一下,bi|n-ai => n-aiΞ0(mod bi) => nΞai(mod bi),也就是一个同余方程了。如果只解决这一个,我们可以直接一个扩欧敲下去,但这里有k个方程。我们再看题,题目要求我们求出最小的n满足所有同余方程,并且b1,b2...bn两两互质。这不就是中国剩余定理吗?所以把板子打上去就可以了。这题要注意的是ai可能为负数,不过我们把它转成正的就可以了。还有就是直接乘会爆long long,所以我们还要用到喜闻乐见的龟快速乘。
#include <cstdio>
#define maxn 15
using namespace std; long long a[maxn], b[maxn], m[maxn], t[maxn]; inline long long read(){
register long long x(), f=; register char c(getchar());
while(c<''||''<c){ if(c=='-') f=-; c=getchar(); }
while(''<=c&&c<='')
x=(x<<)+(x<<)+(c^), c=getchar();
return x*f;
} inline long long mul(long long a, long long b, long long c){
long long ans=;
while(b){
if(b&) ans=(ans+a)%c;
a=(a<<)%c;
b>>=;
}
return ans;
} void ex_gcd(long long a, long long b, long long &x, long long &y){
if(!b) x=, y=;
else{
long long x1, y1;
ex_gcd(b, a%b, x1, y1);
x=y1, y=x1-a/b*y1;
}
} int main(){
long long n=read();
for(register int i=; i<=n; i++) a[i]=read();
for(register int i=; i<=n; i++) b[i]=read();
for(register int i=; i<=n; i++) a[i]=(a[i]%b[i]+b[i])%b[i];
long long tot=, tmp;
for(register int i=; i<=n; i++) tot*=b[i];
for(register int i=; i<=n; i++) m[i]=tot/b[i];
for(register int i=; i<=n; i++) ex_gcd(m[i], b[i], t[i], tmp),t[i]=(t[i]%b[i]+b[i])%b[i];
long long ans=;
for(register int i=; i<=n; i++) ans=(ans+mul(mul(a[i],m[i],tot),t[i],tot))%tot;
ans=(ans+tot)%tot;
printf("%lld\n", ans);
return ;
}
刚学懂中国剩余定理的可以来肝这个裸题。
[TJOI2009]猜数字的更多相关文章
- P3868 [TJOI2009]猜数字
[TJOI2009]猜数字 中国剩余定理 求解i=1 to n : x≡a[i] (mod b[i])的同余方程组 设 t= ∏i=1 to n b[i] 我们先求出 i=1 to n : x≡1 ( ...
- CRT【p3868】[TJOI2009]猜数字
Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...
- [Luogu3868] [TJOI2009]猜数字
题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...
- [TJOI2009]猜数字(洛谷 3868)
题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...
- [TJOI2009] 猜数字 - 中国剩余定理
现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ...
- Luogu P3868 [TJOI2009]猜数字
题目链接 \(Click\) \(Here\) 中国剩余定理的板子.小心取模. #include <bits/stdc++.h> using namespace std; const in ...
- 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)
洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...
- 洛谷 P3868 [TJOI2009]猜数字
题意简述 给定\(a[1],a[2],\cdots,a[n]\) 和 \(b[1],b[2],\cdots,b[n]\),其中\(b\)中元素两两互素. 求最小的非负整数\(n\),满足对于任意的\( ...
- C语言猜数字游戏
猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...
随机推荐
- 在macOS下使用MAXPP搭建本地开发服务器简易流程
本文适用于解决前端开发时所需的服务器支持,包括文件上传和下载.在开发环境中需要保持尽量的开放,并不是安全的.根据浏览器安全协议,所下载的开源项目是不能直接在file中直接打开的,需要把文件放置在服务器 ...
- cmake教程
1 教程 cmake界的hello world[2] 进阶的入门教程参考[3] 2 引用 [1] cmake官网 [2] 在 linux 下使用 CMake 构建应用程序 [3] Valgrind官网
- windows server 简化设置
win2012任务管理器显示磁盘管理员运行命令提示符,diskperf -y 不要开机密码 运行 netplwiz 勾去掉 运行 gpedit.msc 计算机设置-Windows设置 -安全设置-帐户 ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
- 一、自动化平台搭建-python虚拟环境安装
主要知识点介绍: 安装django环境 创建django项目 设计模型类并利用模型类和数据库进行交互 使用django后台管理数据 编写视图函数,进行URL配置 模板的使用 图书-英雄案例完成 1.虚 ...
- 还不知道spring的RestTemplate的妙用吗
为什么要使用RestTemplate? 随着微服务的广泛使用,在实际的开发中,客户端代码中调用RESTful接口也越来越常见.在系统的遗留代码中,你可能会看见有一些代码是使用HttpURLConnec ...
- KaliLinuxNetHunter教程实施刷机解锁Bootloader
KaliLinuxNetHunter教程实施刷机解锁Bootloader 当用户将前面的工作都准备完成后,即可开始刷机.其中,整个刷机过程分为三个步骤,分别是解锁Bootloader.刷入第三方Rec ...
- (二)文档请求不同源之window.postMessage跨域
一.基本原理 HTML5为了解决跨域,引入了跨文档通信API(Cross-document messaging).这个API为window对象新增了一个window.postMessage方法,允许跨 ...
- C 小白的 thrift 环境搭建
公司有个通讯 是用的 thrift ,thrift 是个什么都东西,可以类比 webservice 吧,比 webservice 高效些,不管是啥,搞他! 先在 mac 上搞本地开发环境 网上一搜 貌 ...
- CF1037E. Trips
题目链接 CF1037E. Trips 题解 每次删点后,对不满足要求的点拓扑 代码 #include<map> #include<queue> #include<vec ...