首页 > 其他分享 >204. 表达整数的奇怪方式

204. 表达整数的奇怪方式

时间:2022-11-16 22:22:49浏览次数:64  
标签:le 表达 204 int LL 整数 return define

题目链接

204. 表达整数的奇怪方式

给定 \(2n\) 个整数 \(a_1,a_2,…,a_n\) 和 \(m_1,m_2,…,m_n\),求一个最小的非负整数 \(x\),满足 \(\forall i \in [1,n],x \equiv m_i(mod\ a_i)\)。

输入格式

第 \(1\) 行包含整数 \(n\)。

第 \(2…n+1\) 行:每 \(i+1\) 行包含两个整数 \(a_i\) 和 \(m_i\),数之间用空格隔开。

输出格式

输出最小非负整数 \(x\),如果 \(x\) 不存在,则输出 \(-1\)。
如果存在 \(x\),则数据保证 \(x\) 一定在 \(64\) 位整数范围内。

数据范围

\(1 \le a_i \le 2^{31}-1\),
\(0 \le m_i < a_i\)
\(1 \le n \le 25\)

输入样例:

2
8 7
11 9

输出样例:

31

解题思路

扩展中国剩余定理

假设已经求出了前 \(k-1\) 个方程的一个特解 \(x\),设 \(m=lcm(a_1,a_2,\dots,a_{k-1})\),则其通解为 \(x+k\times m\)(其中 \(k\) 为整数),现在需要考虑第 \(k\) 个方程,即要找到这样的一个 \(t\),使得 \(x+t\times m\equiv b_k(\bmod a_k)\),即 \(t\times m\equiv b_k-x(\bmod a_k)\),利用扩展欧几里得即可求解这样的 \(t\),在利用扩欧通解更新 \(x\),同时更新 \(m\),最后的 \(x\) 即为答案

  • 时间复杂度:\(O(mlogn)\)

代码

// Problem: 表达整数的奇怪方式
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/206/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=30;
int n,a[N],b[N];
LL res;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
	if(!b)
	{
		x=1,y=0;
		return a;
	}
	LL d=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
    bool f=true;
    res=b[1];
    LL lcm=a[1];
    for(int i=2;i<=n;i++)
    {
    	LL x,y;
    	LL d=exgcd(lcm,a[i],x,y);
    	if((b[i]-res)%d!=0)
    	{
    		f=false;
    		break;
    	}
    	x*=(b[i]-res)/d;
    	LL t=a[i]/d;
    	x=(x%t+t)%t;
    	res+=lcm*x;
    	lcm=(LL)a[i]/d*lcm;
    }
    if(f)
    	printf("%lld",(res%lcm+lcm)%lcm);
    else
    	puts("-1");
    return 0;
}

标签:le,表达,204,int,LL,整数,return,define
From: https://www.cnblogs.com/zyyun/p/16897764.html

相关文章

  • 计算从1到正整数n中,出现多少次给定的数(0到9)
    输入一个[0-9]之间的数字m,统计出从1开始到正整数n中的数字的序列里,一共出现多少次这个数字。基本思路考虑在十进制下,n的每一位可能出现多少次m。举个例子:若要求1到153......
  • 大整数求和
    */*Copyright(c)2016,烟台大学计算机与控制工程学院*Allrightsreserved.*文件名:text.cpp*作者:常轩*微信公众号:Worldhello*完成日期:2016年9月8日*版本号:V1.......
  • 18.正则表达式
    search方法输出的是a开始的位置6replace方法正则表达式是单独的技术,每个语言都有不同......
  • (二)递归 4132 四则运算表达式求值
    四则运算表达式求值​​AC代码​​​​解析​​​​坑​​​​新知识​​​​cout格式​​​​true代表1,false代表0​​​​输入流操作​​​​ASCII​​AC代码/***********......
  • cron表达式
    这种表达式称为cron表达式,通过cron表达式可以灵活的定义出符合要求的程序执行的时间。本小节我们就来学习一下cron表达式的使用方法。如下图:cron表达式分为七个域,之间使......
  • Spring 中定时任务cron表达式问题
    1.问题:Cronexpressionmustconsistof6fields(found7in“0/5****?*“)@Scheduled(cron="0/5****?*")2.原因:年的项1099~2099年,为默认。因此只需要......
  • c++匿名表达式
    C++11Lambda表达式 C++11中的匿名函数(lambda函数,lambda表达式)https://gitlab.com/yzzy/modern-cpp/-/blob/main/c16_lambda/main.cpp[](intx,inty){return......
  • 一个很好用的 C++ 高精度整数板子
    点击查看代码typedeflonglongll;typedeflongdoubleld;typedefcomplex<ld>pt;constintMOD=1e9+7;constldPI=acos(-1.L);template<classT>struc......
  • [Python]学习笔记之-正则表达式
           在使用Python做文件处理时,经常需要使用到匹配、搜索功能,这就离不开一个核心的知识:正则表达式。正则表达式(RegularExpression)描述一种字符串匹配的模式(pat......
  • 正则表达式
    正则表达式是一个非常强的功能.日常查找和替换数据都是非常好的.工具有一些工具可视化正则表达式 和表达式测试工具.也可以用sublime的查找和替换来进程测试.正则表......