ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Luogu P4777】 扩展中国剩余定理(EXCRT)

2020-05-13 22:07:27  阅读:289  来源: 互联网

标签:P4777 return int Luogu ll long EXCRT ull define


先贴代码,解析待填坑。

#include<cstdio>
#include<algorithm>
#define int long long
#define ll long long
#define ld long double
#define ull unsigned long long
using namespace std;
int n,a[100005],b[100005];
int exgcd(int a,int b,int &x,int &y)
{
	if (b==0)
	{
		x=1,y=0;
		return a;
	}
	int ans=exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return ans;
}
inline ll ksc(ll x,ll y,ll p)
{
    ll z=(ld)x/p*y;
    ll res=(ull)x*y-(ull)z*p;
    return (res+p)%p;
}
signed main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++)
		scanf("%lld%lld",&a[i],&b[i]);
	int GCD,A1,A2,K1,K2,R,x=b[1],LCM;
	for (int i=2;i<=n;i++)
	{
		if (b[i]<b[i-1]) swap(a[i],a[i-1]),swap(b[i],b[i-1]);
		A1=a[i-1],K1,A2=a[i],K2,R=b[i]-b[i-1];
		GCD=exgcd(A1,A2,K1,K2);LCM=A1/GCD*A2;
		K1=(K1%A2+A2)%A2;
		K1=ksc(K1,R/GCD,A2);
		x=(ksc(K1,A1,LCM)+b[i-1])%LCM;
		b[i]=x,a[i]=LCM;
	}
	printf("%lld",x);	
	return 0;
}

标签:P4777,return,int,Luogu,ll,long,EXCRT,ull,define
来源: https://www.cnblogs.com/notscience/p/12885177.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有