题意:

韩信有若干个兵,给定你若干个模数和余数,再给你一个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 中国剩余定理的更多相关文章

  1. 牛客多校第十场-D- Rikka with Prefix Sum

    链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...

  2. 牛客多校第十场 A Rikka with Lowbit 线段树

    链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...

  3. 2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理

    题意 求解 $n$ 个模方程 $x \equiv a (mod \ b)$,不保证模数互素($1 \leq n \leq 100$,$0 \leq b < a< 10^5$). 分析 套扩 ...

  4. 牛客多校第十场 B Coffee Chicken 递归

    题意: 给你一个“斐波那契”字符串数列,第n项由第n-1项和第n-2项拼接而成,输出某项的某位及其后10位. 题解: 递归求解即可. #include<bits/stdc++.h> usi ...

  5. 牛客多校第十场 E Hilbert Sort 递归,排序

    题意: 给你一个方阵,再在方阵上给定一些点,按照希尔伯特曲线经过的先后顺序为这些点排序 题解: 定义好比较函数后直接调用排序算法即可. 希尔伯特曲线本来就是用于二维到一维的映射的,因此我们可以考虑对于 ...

  6. 牛客多校第十场 H Stammering Chemists 判断图同构

    题意: 给出一个无向图,表示一种有机物质的结构式,问你这个有机物质是列表中的哪个. 题解: 判断图同构需要枚举全排列以对应点,但是此题中几乎只需要将点度数排序后一个一个比较,对于甲基位置再加个特判即可 ...

  7. 牛客多校第十场 F Popping Balloons 线段树维护稀疏矩阵

    题意: 给定一个稀疏矩阵,里面有若干个气球,让你横着开三枪,竖着开三枪,问最多能打爆多少气球,要求相同方向,相邻两枪必须间隔r. 题解: 横向记录每列有多少个气球,分别在哪行上. 然后把这个数据改造成 ...

  8. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

  9. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

随机推荐

  1. Magento站点优化方案

    Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求.既然如此还是很自然 ...

  2. java 多上传 CommonsMultipartFile[] files

    /** * 视频上传 * ddl * @param request * @param response * @param files * @return * @throws Exception */@ ...

  3. SQL 查询子句

    SQL WHERE Clause(查询子句) WHERE 子句用于过滤记录. SQL WHERE 子句 WHERE子句用于提取满足指定标准的记录. SQL WHERE 语法 SELECT column ...

  4. sql update语句

    如果要更新数据库表中的记录,我们就必须使用UPDATE语句. UPDATE语句的基本语法是: UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; ...

  5. web服务nginx和php的相互关系

    nginx和php有什么关系?很多新手可能有这个疑问,我之前学php也没注意这些问题,只管着按文档配置操作,完成php项目就不管了,最近特意总结了一下. php是一门编程语言,讲究说学逗唱...呃,不 ...

  6. (转)ubuntu 下安装mysql5.5.30的过程以及遇到的问题

    转:http://blog.chinaunix.net/uid-27103408-id-3280584.html 由于实验需要安装mysql,当然我们可以通过sudo apt-get install ...

  7. 如何在一个for语句中迭代多个对象(2.7)

    如何在一个for语句中迭代多个对象 总结: 并行迭代使用zip(l1, l2, l3) 每次迭代从3个列表里各取一个数据 串行迭代使用itertools.chain(l1, l2, l3) 相当于把3 ...

  8. unittest框架学习笔记三之testsuite

    # coding=utf-8 '''created :2018/3/29 author:star project: testsuite'''import unittest,time,osfrom ba ...

  9. C语言中的数据类型转换函数

    头文件#include<stdlib.h> 1. 函数名: atof 功 能: 把字符串转换成浮点数 用 法: double atof(const char *nptr); 2.函数名: ...

  10. msf反弹shell

    今天回顾了一下msf反弹shell的操作,在这里做一下记录和分享.( ̄︶ ̄)↗ 反弹shell的两种方法 第一种Msfvenom实例: 1.msfconsole #启动msf 2.msfvenom - ...