2018.10.8每天认真做一道数学(数论)题之[TJOI2009]猜数字【中国剩余定理】

由已知:
{ ( n − a 1 )   ∣   b 1 ( n − a 2 )   ∣   b 2 . . .   . . . ( n − a k )   ∣   b k \begin{cases} (n-a_1)\ |\ b_1\\ (n-a_2)\ |\ b_2\\ ...\ ...\\ (n-a_k)\ |\ b_k\\ \end{cases} (na1)  b1(na2)  b2... ...(nak)  bk

变换一下:
{ n − a 1 ≡   0   ( m o d    b 1 ) n − a 2 ≡   0   ( m o d    b 2 ) . . .   . . . n − a k ≡   0   ( m o d    b k ) \begin{cases} n-a_1≡\ 0\ (mod\ \ b_1)\\ n-a_2≡\ 0\ (mod\ \ b_2)\\ ...\ ...\\ n-a_k≡\ 0\ (mod\ \ b_k)\\ \end{cases} na1 0 (mod  b1)na2 0 (mod  b2)... ...nak 0 (mod  bk)

再变换一下:
{ n ≡   a 1   ( m o d    b 1 ) n ≡   a 2   ( m o d    b 2 ) . . .   . . . n ≡   a k   ( m o d    b k ) \begin{cases} n≡\ a_1\ (mod\ \ b_1)\\ n≡\ a_2\ (mod\ \ b_2)\\ ...\ ...\\ n≡\ a_k\ (mod\ \ b_k)\\ \end{cases} n a1 (mod  b1)n a2 (mod  b2)... ...n ak (mod  bk)

然后就直接上 c r t crt crt模板,但是这道题有几个地方要注意:
1. 1. 1.输入的 a [ i ] a[i] a[i]可能为负
2. 2. 2.中间计算结果的时候可能会包 l o n g    l o n g long \ \ long long  long,中间要用快速乘。

O ( 1 ) O(1) O(1)快速乘模板:

inline ll mul(ll x,ll y,ll mod) {
    x%=mod,y%=mod;
    ll z=(long double)x*y/mod,ans=x*y-z*mod;
    
    if(ans<0) ans+=mod;
    else if(ans>=mod) ans-=mod;
    
    return ans;
}

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define repl(i,x,y) for(ll i=(x);i<(y);i++)
#define repd(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=1e4+5;
const ll Inf=1e18;

ll k,n,a[N],b[N];

inline ll add(ll x,ll y,ll mod) {
	return x+y>=mod?x+y-mod:x+y;
}

inline ll mul(ll x,ll y,ll mod) {
    x%=mod,y%=mod;
    ll z=(long double)x*y/mod,ans=x*y-z*mod;
    
    if(ans<0) ans+=mod;
    else if(ans>=mod) ans-=mod;
    
    return ans;
}

void exgcd(ll a,ll b,ll &x,ll &y) {
	if(!b) {
		x=1,y=0;return ;
	}exgcd(b,a%b,x,y);
	ll ret=x;x=y;y=ret-a/b*y;
}

void china() {
	ll bb=1;
	
	rep(i,1,k) bb*=b[i];
	
	rep(i,1,k) {
		ll x,y,bi=bb/b[i];
		exgcd(bi,b[i],x,y);
		x=(x%b[i]+b[i])%b[i];
		n=(n+mul(mul(x,bi,bb),a[i],bb))%bb;
	}
	
	n=(n+bb)%bb;
}

int main() {
	scanf("%lld",&k);
	
	rep(i,1,k) scanf("%lld",&a[i]);
	
	rep(i,1,k) scanf("%lld",&b[i]);
	
	rep(i,1,k) a[i]=(a[i]%b[i]+b[i])%b[i];
	
	china();
	
	printf("%lld\n",n);

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《初赛知识点信息学竞赛中的数学知识_2019_10_15.pdf》是一份关于数学知识在信息学竞赛中的初赛知识点的文件。 在信息学竞赛中,数学知识是其中一个重要的组成部分。这份文件旨在总结了2019年10月15日初赛中涉及的数学知识点,可供参赛选手进行备考和复习。 根据文件内容,数学方面的知识点主要包括以下几个方面: 1. 数论知识:涉及素数、因数分解、最大公约数和最小公倍数等基本概念,同时还包括欧拉函数、同余关系等高级概念。 2. 代数与方程:涉及一元高次方程的求解方法,如配方法、根与系数的关系等;另外还包括幂指函数和对数函数的性质与应用。 3. 几何:主要包括平面几何和立体几何的知识点,如平行线的性质、三角形的相似与共线、立体图形的体积和表面积的计算等。 4. 概率与统计:概率与统计的基本概念与计算方法,如样本空间、事件的概率、条件概率、期望值、方差等。 5. 计数学:排列组合、递推关系等计数学的基本概念和计算方法。 以上是我根据文件内容归纳的数学知识点,选手们可以根据这份文件中提及的知识点进行系统地复习和准备,以应对竞赛中的数学。希望这份文件能对选手们的备考有所帮助,祝愿大家在竞赛中取得优异的成绩! ### 回答2: 初赛知识点信息学竞赛中的数学知识主要包括以下几个方面。 首先是数论数论是研究整数性质和整数间的关系的学科,包括素数、最大公约数、最小公倍数、同余、数的性质等内容。在信息学竞赛中,常常涉及到数论,需要熟悉数论基本定理和推理方法。 其次是排列组合。排列组合是研究对象的排列方式和选择方式的学科。在信息学竞赛中,常常出现排列组合问,需要熟悉各种排列组合的计数方法和性质。 再次是概率与统计。概率与统计是研究事件发生的可能性和数据分析的学科,包括概率分布、随机变量、期望值、方差、统计量等内容。在信息学竞赛中,常常需要用到概率与统计的知识解决问。 此外,还需要掌握一些基本的数学工具,比如函数、方程、不等式、数列等。这些基本的数学工具在信息学竞赛中经常会被用到,对于解非常重要。 综上所述,初赛知识点信息学竞赛中的数学知识主要包括数论、排列组合、概率与统计以及基本的数学工具。熟练掌握这些知识点,对于在竞赛中取得好成绩非常关键。 ### 回答3: 《初赛知识点信息学竞赛中的数学知识_2019_10_15.pdf》是一份文件,主要介绍了信息学竞赛初赛中涉及到的数学知识点。 从文件中我们可以了解到,数学在信息学竞赛中扮演着重要的角色。文件中列举了一些与数学有关的知识点,包括数论、组合数学、概率论和统计学等。 在数论方面,文件提到了整数的性质、素数的判断与应用、最大公约数和最小公倍数的计算方法等。对这些知识点的掌握将有助于解决与整数相关的问。 在组合数学方面,文件介绍了排列组合、二项式定理和容斥原理等概念。这些知识点对于解决与排列组合相关的问非常重要,需要熟练掌握。 概率论和统计学也是信息学竞赛中的重要知识点。文件中提到了概率的计算方法和统计学的一些基本概念,如均值、方差和标准差等。熟悉这些知识点可以帮助寻找问的规律和解决方法。 总的来说,文件《初赛知识点信息学竞赛中的数学知识_2019_10_15.pdf》重点介绍了数论、组合数学、概率论和统计学等数学知识点在信息学竞赛中的应用。务必对这些知识点进行深入理解和掌握,以提高自己在竞赛中的解能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值