首页 > 其他分享 >同余——推柿子

同余——推柿子

时间:2023-06-17 09:12:19浏览次数:40  
标签:p2 p1 int ll exgcd 柿子 bmod 同余

同余——推柿子

eg1.[P1516青蛙的约会](P1516 青蛙的约会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

题意:

设青蛙 A 的出发点坐标是 \(x\),青蛙 \(B\) 的出发点坐标是 \(y\)。青蛙 \(A\) 一次能跳 \(m\) 米,青蛙 \(B\) 一次能跳 \(n\) 米,两只青蛙跳一次所花费的时间相同。纬度线总长$ L$ 米。现在要你求出它们跳了几次以后才会碰面。

题解:

\(p1+mx \equiv p2+nx(\bmod l)\)

\((m-n)x \equiv (p2-p1)(\bmod l)\)

设\(m-n = a,l = b,p2-p1 = c\)

则有\(ax\equiv c(\bmod b)\)注意这里a可能为负数,\(\gcd\)只对非负整数有意义,所以处理一下:若\(a<0,a = -a,c = -c\)

那么\(x \equiv c\times a^{-1}(\bmod b)\),接下来我们求\(a^{-1}\)

\(ax \equiv 1(\bmod b)\)由\(exgcd\)可解出\(x\)就是\(a^{-1}\)

设\(d = exgcd(a,b,x,y)\),那么\(x = (((\frac{c}{d})\times x)\bmod(\frac{b}{d})+(\frac{b}{d}))\bmod (\frac{b}{d})\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p1,p2,m,n,l,a,b,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0)
	{
		x = 1,y = 0;
		return a;
	}
	ll d = exgcd(b,a%b,y,x);
	y -= (a/b)*x;
	return d;
}

int main()
{
	cin>>p1>>p2>>m>>n>>l;
	/*
		(m-n)x ≡ (p2-p1)(mod l)
		(m-n)x + kl = (p2-p1)
		a = m-n,b = l,c = p2-p1;
		ax + by = c;
	*/
	ll a = n-m,b = l,c = p1-p2;
	if(a<0)a = -a,c = -c;
	ll d = exgcd(a,b,x,y);
	//ax0+by0 = d
	//ax0+by0能被d整除,那c也要能整除
	if(c%d)cout<<"Impossible\n";
	else{
		//ax+by = c
		//ax0*(c/d)+by0*(c/d) = c
		//x0*(c/d)是一个解
		cout<<(c/d*x%(b/d)+(b/d))%(b/d)<<endl;
	}
	return 0;
}

eg2.[P2421 [NOI2002] 荒岛野人]([P2421 NOI2002] 荒岛野人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

题意:给n个人,每个人有初始位置,和每年可以走过的洞穴数目及其存活寿命,求洞穴数至少有多少个保证n个人永远不会相遇。

题解:

这题其实和青蛙那题很像,也是给初始位置和每年走过的距离,不同的地方在于,本题求的是不相遇且多了一个寿命的限制。

对于任意两个人来说有:

\(p1 + mx \equiv p2 + nx(\bmod m)\)

其中:\(p\)代表初始位置,\(m\)和\(n\)是每年走过的洞穴数,\(x\)是相遇的时间,\(m\)是洞穴的数目。

我们先\(for\)一遍找到初始位置最大的洞穴编号,以次为起点枚举答案,即洞穴数目m,之后我们再去\(check(m)\)。

那么怎么\(check\)呢?我们要这些人永远不会相遇,那对于任意两个人而言,我们解出的相遇时间x(用\(exgcd\))要么是无解,要么\(x>max(l1,l2)\),\(l\)表示寿命,即在相遇之前就死掉了,所以还是不会相遇的

那么我们找到的第一个符合条件的\(m\)就是答案。

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int maxc,C[N],p[N],l[N];
int n;
int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x = 1,y = 0;
		return a;
	}
	int d = exgcd(b,a%b,y,x);
	y -= (a/b)*x;
	return d;
}
bool judge(int m)
{
	for(int i = 1;i<=n;i++)
	{
		for(int j = i+1;j<=n;j++)
		{
			/*
				ci+pi*x = cj+pj*x (mod m) 不成立
				无解或x>min(li,lj),相遇之前有一个死掉
				(pi-pj)*x = (cj-ci) (mod m)
				ax = c (mod b)
			*/
			int a = p[j]-p[i],b = m,c = C[i]-C[j],x = 0,y = 0;
			if(a<0)a = -a,c = -c;
			int d = exgcd(a,b,x,y);
			if(c%d==0)
			{
				int ans = ((c/d)*x%(b/d)+(b/d))%(b/d);
				if(ans<=min(l[i],l[j]))return false;
			}
		}
	}
	return true;
}

int main()
{
	
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>C[i]>>p[i]>>l[i];
		maxc = max(maxc,C[i]);
	}
	for(int i = maxc;;i++)
	{
		if(judge(i))
		{
			cout<<i<<endl;
			return 0;
		}
	}
	return 0;
}

标签:p2,p1,int,ll,exgcd,柿子,bmod,同余
From: https://www.cnblogs.com/nannandbk/p/17487016.html

相关文章

  • [数论]GCD&LCM&欧拉函——推柿子+例题
    GCD&LCM&欧拉函——推柿子一、\(\sum_{i=1}^{n}[\gcd(i,n)=d]\)\(\sum_{i=1}^{n}[\gcd(i,n)=d]\)\(=\sum_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]\)\(=\phi(\frac{n}{d})\)二、\(\sum_{i=1}^{n}\gcd(i,n)\)\(\sum_{i=1}^{n}\gcd(i,......
  • k 倍区间(同余定理,组合数)
    题目描述给定一个长度为 N 的数列,1,2,⋯A1​,A2​,⋯AN​,如果其中一段连续的子序列 ,+1,⋯(≤)Ai​,Ai+1​,⋯Aj​(i≤j) 之和是 K 的倍数,我们就称这个区间 [,][i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?输入格式第一行包含两个整数 N 和 K......
  • 初等数论(Ⅲ):高次同余、阶和原根相关
    前言关于高次同余方程,有\(a^x\equivb(\text{mod}\p)\)和\(x^a\equivb(\text{mod}\p)\)两种类型,后者计算起来较为麻烦,下文就分别记述这两种高次同余方程。离散对数问题离散对数问题是在模\(p\)意义下求解\(\log_ab\),这等价于形如\[a^x\equivb(\text{mod}\p)......
  • 浅谈同余3(扩展中国剩余定理,扩展BSGS)
    距离上一篇已经四个月了,我来填坑了上一篇:$浅谈同余2(扩展欧几里得,中国剩余定理,BSGS)$(https://www.cnblogs.com/xyy-yyds/p/17418472.html)0x50扩展BSGS$O(\sqrtn)$【模板】扩展BSGS/exBSGS 题目背景题目来源:SPOJ3105Mod题目描述给定$a,p,b$,求满足$a^x≡b\pmodp......
  • 浅谈同余1(常用定理和乘法逆元)
    点个赞吧,球球了~下一篇:$浅谈同余2(扩展欧几里得,中国剩余定理,BSGS)$https://www.acwing.com/file_system/file/content/whole/index/content/7882318/ $\LaTeX$太多了,分成几个部分0x00总写(瞎说)同余是数学中非常重要的东西,这里会写出同余的基本运用若$a\bmodm=b\bmo......
  • [基础数论]同余方程笔记
    前言在学习本节内容前,请确保已完成了二元不定方程的学习。同余方程有无解的判别对于一个方程形如:\[ax\equivb\pmodm\]其中\[a,b\in\mathbbZ,m\in\mathbbZ^+\]并令\[d=(a,m)\]若\(d\nmidb\),则方程\(ax\equivb\pmodm\)无解。若\(d\midb\),......
  • 同余的基本性质
    同余的基本性质注:这里默认$a,b,c,d\in\mathbb{Z},m,k,d\in\mathbb{Z}^+$若$a_1\equivb_1\pmodm$,\(a_2\equivb_2\pmodm\),则\(a_1\pma_2\equivb_1\pmb_2\pmodm\).若$a_1\equivb_1\pmodm$,\(a_2\equivb_2\pm......
  • 同余类与剩余系
    来自潘承洞、潘承彪《初等数论》,有删改。定义1(同余类)把全体整数分为若干个两两不相交的集合,使得\((i)\)在同一个集合中的任两个数模\(m\)一定同余;\((ii)\)在两个不同集合中的任两个数模\(m\)一定不同余。每一个这样的集合称为模\(m\)的同余类。我们以\(r\bmodm\)......
  • 同余的定义以及基本性质学习笔记
    来自潘承洞、潘承彪《初等数论》,有删改。一、定义定义1(同余)设\(m\ne0\)。若\(m\mida-b\),即\(a-b=km\),则称\(m\)为模,\(a\)同余于\(b\)模\(m\)以及\(b\)是\(a\)对模\(m\)的剩余,记作\[a\equivb\pmodm(1)\]否则,则称\(a\)不同余于\(b\)模\(m\),\(b\)不......
  • 同余方程学习笔记
    一、裴蜀定理裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数\(a,b\)和它们的最大公约数\(d\),关于未知数\(x\)和\(y\)的线性不定方程(称为裴蜀等式):若\(a,b\)是整数,且\(\gcd(a,b)=d\),那么对于任意的整数\(x,y,ax+by\)都一定是\(d\)的倍数。特别地,......