牛客多校第十场 D Han Xin and His Troops 中国剩余定理
题意:
韩信有若干个兵,给定你若干个模数和余数,再给你一个1e18以内的范围限制,求解同余方程组,如果无解,输出“他一定在撒谎”,如果最小解超出范围限制,输出“他可能在撒谎”,否则输出最小解
注意:不保证模数互质,也不保证“他可能在撒谎”的情况答案不爆long long
题解:
因为不保证模数互质,需要用excrt求解。
假算法:把excrt的板子翻译成python,然后一脸自闭地调程序
n=0
m=0
bi=[]
ai=[] def ggcd(_m,_n):
if _n == 0:
_x = 1
_y = 0
return _m,_x
_a1 = _b = 1
_a = _b1 = 0
_c = _m
_d = _n
_q = int(_c//_d)
_r = _c%_d
while _r:
_c = _d
_d = _r
_t = _a1
_a1 = _a
_a = _t-_q*_a
_t = _b1
_b1 = _b
_b = _t-_q*_b
_q = int(_c//_d)
_r = _c%_d
_x = _a
_y = _b
return _d,_x def excrt():
x=0
y=0
k=0
gcd=0
M=bi[1]
ans=ai[1]
#print(ai[1],bi[1])
i=2
while(i<=n): a=M
b=bi[i]
c=(ai[i]-ans%b+b)%b gcd,x=ggcd(a,b)
bg=b//gcd if(c%gcd!=0):
return -1
x=(x*c//gcd)%bg
ans=ans+(x*M)
M=M*bg
ans=(ans+M)%M
#print(M,ans,a,b,c,gcd,bg,x)
i=i+1
return (ans%M+M)%M
#xx=0
#yy=0
#print(exgcd(3,6,xx,yy))
n,m = map(int,input().split())
i=1
ai.append(0)
bi.append(0)
while(i<=n):
u,v=map(int,input().split())
bi.append(u)
ai.append(v)
i=i+1
anss=excrt()
if(anss<0):
print("he was definitely lying")
elif(anss>m):
print("he was probably lying")
else:
print(anss)
#不要吐槽我的空格tab混用了
正解:先暴力枚举,计算两两模数的gcd,判断同余方程组是否有解,在保证有解的情况下,将excrt中的模乘过程改成暴力加(龟龟速乘?),一旦超出范围立刻停止运算。
此方法仅适用于同余方程数量和数值都较小的情况。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans,n,a[],p[],base,M; const char *definitely_lie = "he was definitely lying";
const char *probably_lie = "he was probably lying"; int main(){
cin >> n >> M;
for (int i=;i<n;i++) cin >> p[i] >> a[i];
for (int i=;i<n;i++)
for (int j=i+;j<n;j++){
ll d=__gcd(p[i],p[j]);
if (d!=){
if (a[i]%d!=a[j]%d){
puts(definitely_lie);
return ;
}
}
}
ans=; base=;
for (int i=;i<n;i++){
while (ans%p[i]!=a[i]) {
ans+=base;
if (ans>M){
puts(probably_lie);
return ;
}
}
ll gg=p[i]/__gcd(base,p[i]);
if (M/base>=gg) base*=gg;
else {
for (int j=i+;j<n;j++) if (ans%p[j]!=a[j]){
puts(probably_lie);
return ;
}
printf("%lld\n",ans);
return ;
}
}
for (int i=; i<n; i++) assert(ans % p[i] == a[i]);
printf("%lld\n",ans);
return ;
}
牛客多校第十场 D Han Xin and His Troops 中国剩余定理的更多相关文章
- 牛客多校第十场-D- Rikka with Prefix Sum
链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...
- 牛客多校第十场 A Rikka with Lowbit 线段树
链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...
- 2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理
题意 求解 $n$ 个模方程 $x \equiv a (mod \ b)$,不保证模数互素($1 \leq n \leq 100$,$0 \leq b < a< 10^5$). 分析 套扩 ...
- 牛客多校第十场 B Coffee Chicken 递归
题意: 给你一个“斐波那契”字符串数列,第n项由第n-1项和第n-2项拼接而成,输出某项的某位及其后10位. 题解: 递归求解即可. #include<bits/stdc++.h> usi ...
- 牛客多校第十场 E Hilbert Sort 递归,排序
题意: 给你一个方阵,再在方阵上给定一些点,按照希尔伯特曲线经过的先后顺序为这些点排序 题解: 定义好比较函数后直接调用排序算法即可. 希尔伯特曲线本来就是用于二维到一维的映射的,因此我们可以考虑对于 ...
- 牛客多校第十场 H Stammering Chemists 判断图同构
题意: 给出一个无向图,表示一种有机物质的结构式,问你这个有机物质是列表中的哪个. 题解: 判断图同构需要枚举全排列以对应点,但是此题中几乎只需要将点度数排序后一个一个比较,对于甲基位置再加个特判即可 ...
- 牛客多校第十场 F Popping Balloons 线段树维护稀疏矩阵
题意: 给定一个稀疏矩阵,里面有若干个气球,让你横着开三枪,竖着开三枪,问最多能打爆多少气球,要求相同方向,相邻两枪必须间隔r. 题解: 横向记录每列有多少个气球,分别在哪行上. 然后把这个数据改造成 ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
随机推荐
- Java 基础 - System.arraycopy() 浅拷贝 深拷贝
ref: https://blog.csdn.net/balsamspear/article/details/85069207 https://blog.csdn.net/balsamspear/ar ...
- OpenSearch最新功能介绍
摘要:阿里云开放搜索(OpenSearch)是一款结构化数据搜索托管服务,其能够提供简单.高效.稳定.低成本和可扩展的搜索解决方案.OpenSearch以平台服务化的形式,将专业搜索技术简单化.低门槛 ...
- curl查看index以及settings
1.查看mapping curl -u elastic:elastic -XGET "127.0.0.1:9200/index_name/_mapping" 2.查看setting ...
- AcWing 201. 可见的点 (欧拉函数打表)打卡
在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的. 例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1). 部 ...
- NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用
关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...
- unittest框架学习笔记一之testcase
# coding=utf-8案例一: 2 ''' 3 Created on 2017-7-22 4 @author: Jennifer 5 Project:登录百度测试用例 6 ''' 7 from ...
- 4种xml解析器区别
XML作用:不同应用之间的通信和数据共享 Dom遍历法:对内存消耗大,容易内存溢出 SAX方法:事件驱动模式,缺点 不易操作,很难同时访问多处不同数据,对内存消耗不大,速度快 jdom方法: dom4 ...
- git分布式版本控制系统权威指南学习笔记(二):git add暂存区的三个状态以及暂存区的理解
文章目录 不经过git add(到暂存区),能直接进行commit吗? 举个
- 4.1 react 代码规范
关于 基础规范 组件结构 命名规范 jsx 书写规范 eslint-plugin-react 关于 在代码的设计上,每个团队可能都有一定的代码规范和模式,好的代码规范能够提高代码的可读性便于协作沟通, ...
- C#比较两个日期的大小
DateTime dt1 = DateTime.Parse("2006-04-01"); DateTime dt2 = DateTime.Parse("2006-05-0 ...