牛客多校第十场 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的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
随机推荐
- 调用JavaScript实现字符串计算器
调用JavaScript实现字符串计算器 如果表达式是字符串的形式,那么一般我们求值都会遇到很大的问题. 这里有一种直接调用JavaScript的方法来返回数值,无疑神器. 代码如下: @Fros ...
- SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法
原文摘自:http://www.jb51.net/article/52581.htm 这篇文章主要介绍了SELinux导致PHP连接MySQL异常Can't connect to MySQL serv ...
- java EE学习流程(第二版更新)
这周有点堕落了,这两天啥都没写,就顾上刷<庆余年>了
- input限制字符长度 - composition
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- API应用实例
API声明透明 {API声明} type TSetLayeredWindowAttributes = function(wnd: HWND; crKey: DWORD; bAlpha: BYTE; d ...
- App应用推广
Android应用推广渠道: 360手机助手: http://dev.360.cn/ 应用宝: http://open.qq.com/ 百度手机助手: http://shouji.baidu.com/ ...
- (15)centos7 系统服务
centos7 服务启动脚本在 /usr/lib/systemd目录下 1.服务基本操作指令 systemclt [command] [unit] #其中command包括: #start 立即启动 ...
- 关于Unity中文件读取
存储: 在程序发布后文件的存放有两种,第一种是打包到Uniyt的资源包中(*.unity3D),第二种就是把文件存放在一个特殊的目录如:StreamingAssets,这个目录的东西Unity不会打包 ...
- 剑指offer——52第一个只出现一次的字符
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 题解: 想复杂了,从头遍历 ...
- linux 创建用户并限制其访问目录
1.创建用户及访问目录 useradd test1 -d /usr/share/webapps/test -M 设置密码 passwd test1 将访问目录权限全部赋予用户 chown -R te ...