牛客多校第十场 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统计一个子串在指定字符串中出现的次数
今天查着用了用String类里的几个方法,分享下代码 题目要求:统计一个子串在指定字符串中出现的次数( 提示java字串出现了6次) public class SearchSameString { p ...
- MySQL - 两种存储引擎 (MyISAM PK InnoDB) + MVCC
总结 1.两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务.两者最大的区别就是InnoDB支持事务,和行锁. 2.InnoDB采用MVCC(Multi-Version Concur ...
- Magento 消息提示
Magento 消息提示 //成功 Mage::getSingleton('customer/session')->addSuccess('恭喜您关联会员卡成功!'); //失败 Mage::g ...
- 控制台js常用解决方案,字符串替换和抓取列表页链接
抓取列表页链接 由于测试站没有jquery所以,我用了原生的js var obj = document.getElementsByClassName('class1'); for(let i = 0; ...
- 出现Warning: date(): It is not safe to rely on the system's timezone settings的解决办法
在没有配置,尤其是新安装的PHP中使用date函数时,会报这个错误: Warning: date(): It is not safe to rely on the system's timezone ...
- SpringBoot整合MongoDB,在多数据源下实现事务回滚。
项目中用到了MongoDB,准备用来存储业务数据,前提是要实现事务,保证数据一致性,MongoDB从4.0开始支持事务,提供了面向复制集的多文档事务特性.能满足在多个操作,文档,集合,数据库之间的事务 ...
- 静态栈-------C语言
/***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...
- 22、继续javascript,左边选中的跳到右边
1. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title& ...
- 制作Lightbox效果
制作Lightbox效果 Lightbox是网页上常用的一种效果,比如单击网页上某个链接或图片,则整个网页会变暗,并在网页中间弹出一个层来.此时,用户只能在层上进行操作,不能在单击变暗的网页. 程序代 ...
- Quartus II 使用 modelsim 仿真
转自:http://www.cnblogs.com/emouse/archive/2012/07/08/2581223.html Quartus 中调用modelsim的流程 1. 设定仿真工具 as ...