牛客多校第十场 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的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
随机推荐
- elementUI 日期时间选择器 只能选择当前及之后的时间
日期时间选择器 只能选择当前及之后的时间 <el-date-picker class="input-border-null" prefix-icon="el-ic ...
- TxtUtil
/** *包名:cn.yufu.utils *描述:package cn.yufu.utils; */ package cn.yufu.utils; import java.io.BufferedRe ...
- Shiro学习(4)INI配置
之前章节我们已经接触过一些INI配置规则了,如果大家使用过如spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根 ...
- bzoj1044题解
[题意分析] 本题等价于如下描述: 有一个长度为n的正整数序列,要求将其分解成m+1个子串,使最大子串和最小.求这个最大子串和及对应的分解方案数. [解题思路] 第一问二分+贪心即可.容易证明对于确定 ...
- elementUi-复选框,使用v-for循环出来的复选框,默认多个值为勾选状态
1. 使用 v-model="BottomSelectFor[index].tick" 绑定要默认勾选的状态 2.在数组中定义 tick:true,没有的字段默认为false 3. ...
- [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
Orz 出题人石二队爷 我们可以先求出有n个点的联通欧拉图数量,然后使它删或增一条边得到我们要求的方案 也就是让它乘上$C_n^2$ (n个点里选2个点,要么删边要么连边,选择唯一) 那么接下来就是求 ...
- windows 驱动开发 DDK与WDK WDM的区别
1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发W ...
- springboot启动失败( No active profile set, falling back to default profiles: default)
问题: springboot启动失败( No active profile set, falling back to default profiles: default) 解决方法 在pom.xml文 ...
- (转载)js调用打印机 打印整体或部分
本文转载自:https://www.cnblogs.com/lfhy/p/6802781.html 以下为原文内容: 有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局 ...
- XVIII Open Cup named after E.V. Pankratiev. GP of SPb
contest Link A. Base i − 1 Notation solved by sdcgvhgj 238 求出a+b的2进制后从低位到高两位两位地转化为i-1进制 i-1进制的第2k位和第 ...