洛谷题目传送门

90分WA第二个点的看过来!

简要介绍一下中国剩余定理

中国剩余定理,就是用来求解这样的问题:

假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[1,k],i\neq j,b_i\)与\(b_j\)互质)

\(\begin{cases}n\equiv a_1(\mod b_1)\\n\equiv a_2(\mod b_2)\\......\\n\equiv a_k(\mod b_k)\end{cases}\)

设\(lcm=\prod_{i=1}^kb_i\),那么此方程组在模\(lcm\)意义下有且仅有一个解\(\sum_{i=1}^ka_ix_i\frac{lcm}{b_i}\),其中\(\frac{lcm}{b_i}x_i\equiv1(\mod b_i)\)

证明思路什么的看别的大佬的吧

那么就可以直接用扩欧或欧拉定理求\(x_i\),轻松地得到结果。

由于直接乘的时候会爆longlong,所以要写快速乘,及时取模

可是还WA第二个点是怎么回事?

原来题目里说了\(a_i\)可能为负数!真是用(sang)心良(bing)苦(kuang)啊!

既然是模\(b_i\)意义下的,可以很快把它转成正数。

#include<cstdio>
#define LL long long
#define in(x) scanf("%lld",x)
#define add(a,b) a=(a+b)%s
LL k,a[11],b[11],i,x,y,t,s=1,ans=0;
void exgcd(LL a,LL b){//扩欧
if(!b){x=1;y=0;return;}
exgcd(b,a%b);
t=x;x=y;y=t-a/b*y;
}
LL mul(LL a,LL b){//快速乘
LL r=0;
while(b){
if(b&1)add(r,a);
add(a,a);
b>>=1;
}
return r;
}
int main(){
in(&k);
for(i=1;i<=k;++i)in(a+i);
for(i=1;i<=k;++i)in(b+i),s*=b[i];//求lcm
for(i=1;i<=k;++i){
exgcd(s/b[i],b[i]);
x=(x%b[i]+b[i])%b[i];//求xi最小非负整数解
add(ans,mul(s/b[i]*x,(a[i]%b[i]+b[i])%b[i]));//别忘处理ai
}
printf("%lld\n",ans);
return 0;
}

以上的main函数里,蒟蒻把\(x_i,a_i\)都化成了最小非负整数。实际上,同余的性质很好,用不着化来化去的。最精简的写法是这样

	for(i=1;i<=k;++i){
exgcd(s/b[i],b[i]);
add(ans,mul(s/b[i]*x,a[i]%b[i]+b[i]));
}

洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)的更多相关文章

  1. 洛谷 P3868 [TJOI2009]猜数字

    题意简述 给定\(a[1],a[2],\cdots,a[n]\) 和 \(b[1],b[2],\cdots,b[n]\),其中\(b\)中元素两两互素. 求最小的非负整数\(n\),满足对于任意的\( ...

  2. [TJOI2009] 猜数字 - 中国剩余定理

    现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ...

  3. 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 ( ...

  4. Luogu P3868 [TJOI2009]猜数字

    题目链接 \(Click\) \(Here\) 中国剩余定理的板子.小心取模. #include <bits/stdc++.h> using namespace std; const in ...

  5. 数论之同余性质 线性同余方程&拔山盖世BSGS&中国剩余定理

    先记录一下一些概念和定理 同余:给定整数a,b,c,若用c不停的去除a和b最终所得余数一样,则称a和b对模c同余,记做a≡b (mod c),同余满足自反性,对称性,传递性 定理1: 若a≡b (mo ...

  6. [TJOI2009]猜数字(洛谷 3868)

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  7. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

  8. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  9. CRT【p3868】[TJOI2009]猜数字

    Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...

随机推荐

  1. Ionic app升级插件开发

    终于走到了写插件的这个地方了,插件的过程: 1.安装plugman插件,管理我们的程序 npm install -g plugman 2.创建插件项目appUpgrade,cd 到你的目标目录下,执行 ...

  2. C# 简单的 Job 作业~

    改变之前的前言,这次咱这样写: 一个习惯只需十天的坚持就可以养成,坏习惯也不例外!吸烟喝酒的我能否做到十天不吸烟喝酒呢? 呵呵 养成习惯关键还要看决心和意志力 恩,努力控烟吧! 废话说完了,就进入咱们 ...

  3. AutoMapper自动映射

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 不扯犊子,直接进入正题: AutoMapper自动映射常用于EF中,能很好的解决DTO和Model之间相互映射的问题.在未使用AutoMappe ...

  4. Spring Boot(十六):使用 Jenkins 部署 Spring Boot

    Jenkins 是 Devops 神器,本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建.部署分为四个步骤: 第一步,Jenkins 安装 第二步, ...

  5. 跨平台、跨语言应用开发,Elements 介绍

    目录 1,Elements 介绍 2,Elements 版本 3,Elements 能干嘛 4,Elements  IDES 5,Elements 工具 1,Elements 介绍 RemObject ...

  6. 树莓派Opencv张正友棋盘标定法

    make.Makefile cc = gcc #最简易的makefile文件,这个可以用来进行文件之间的简易构建和链接,生成我们所需要的执行文件: prom = calc deps = $(shell ...

  7. Ubuntu16.04下安装QQ的完整操作记录(经验证可用)

    本机安装了Ubuntu16.04系统,用于日常运维办公.打算在Ubuntu上安装QQ,如下操作记录也使用于Ubuntu18.04: 1)先下载特制的QQ程序包(其实就是基于Wine容器做了一些封装,程 ...

  8. Linux系统本地yum源环境配置记录

    由于IDC的一些服务器没有外网,不能对外访问.所以打算部署一套内网的yum源环境,以供内网服务器使用.以下简单记录下操作过程: 1)下载centos6.9和centos7.3的镜像,并挂载 [root ...

  9. redis持久化策略梳理及主从环境下的策略调整记录

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...

  10. UML类图及类与类之间的关系

    原文地址:http://www.uml.org.cn/oobject/201211231.asp 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的 ...