这道题我第一眼居然想着用二分法做,结果,还是不满足二分条件。
WA代码如下

#include<iostream>using namespace std;const int N=30;int a[N],m[N];
int n;bool check(int x)
{for(int i=1;i<=n;i++){if(x%a[i]!=m[i])return false;}return true;
}int main(void)
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&m[i]);}int l=1,r=1e9;while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;elsel=mid+1;}if(check(l))printf("%d",l);elseprintf("-1");
}

我找到了一个很优质的题解转载自一位大佬

https://www.acwing.com/solution/content/21747/

这个题解写的很详细,和y总说的很一致,
我看y总视频看明白了用欧几里得求k1,之后就卡住了,看了这篇博文,我好像也是明白了很多。
给大家看看博文的核心内容



除了最后一步的a1,m1更新操作没看懂,其余的我可以写出大致思路。
代码如下
刚开始我觉得代码应该是这样的。但是发现WA了,应该是爆栈了,所以看了一下别的代码,我发现他们多了一步很关键的操作

错误代码如下。

#include<iostream>using namespace std;typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y)
{if(!b){x=1,y=0;return a;}LL d;d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}int main(void)
{int n;scanf("%d",&n);LL a1,m1;cin>>a1>>m1;bool flag=true;for(int i=0;i<n-1;i++){LL a2,m2;cin>>a2>>m2;LL k1,k2;LL d=exgcd(a1,-a2,k1,k2);if((m2-m1)%d){flag=false;break;}k1*=(m2-m1)/d;LL t=a2/d;m1=k1*a1+m1;a1=abs(a1/d*a2);}if(flag) printf("%lld",(m1%a1+a1)%a1);elseputs("-1");
}

k1=(k1%t+t)%t

这一步很类似于哈希,可能是为了防止后面的递推被错误认为不能执行然后被误判为不能得到x.
其实 这样可以有效避免了误判。
图例如下

#include<iostream>using namespace std;typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y)
{if(!b){x=1,y=0;return a;}LL d;d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}int main(void)
{int n;scanf("%d",&n);LL a1,m1;cin>>a1>>m1;bool flag=true;for(int i=0;i<n-1;i++){LL a2,m2;cin>>a2>>m2;LL k1,k2;LL d=exgcd(a1,-a2,k1,k2);if((m2-m1)%d){flag=false;break;}k1*=(m2-m1)/d;LL t=a2/d;k1=(k1%t+t)%t;m1=k1*a1+m1;a1=abs(a1/d*a2);}if(flag) printf("%lld",(m1%a1+a1)%a1);elseputs("-1");
}


很神奇。
又是Orz的一天!!!

AcWing 204. 表达整数的奇怪方式相关推荐

  1. AcWing 204. 表达整数的奇怪方式 / Strange Way To Express Integers

    我作为一个初中蒟蒻,听y大视频听了5遍还不懂,快哭了.然后终于(好像)搞懂,写成题解加深一下记忆... 将式子等价转换 对于每两个式子(我们考虑将其合并): \(x \equiv a_1 \%\ m_ ...

  2. 204. 表达整数的奇怪方式(exgcd,,,数学推导,借助中国剩余定理)

    204. 表达整数的奇怪方式 题意: y总的笔记 墨染空大佬的 题解%%%%% AC # include <bits/stdc++.h> using namespace std; type ...

  3. 【华为OD机试真题 JAVA】用连续自然数之和来表达整数

    JS版:[华为OD机试真题 JS]用连续自然数之和来表达整数 标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表 ...

  4. 【华为OD机试真题 JS】用连续自然数之和来表达整数

    标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表示.给定一个整数,计算该整数有几种连续自然数之和的表达式,且打 ...

  5. 【用连续自然数之和来表达整数】

    ■ 题目描述 [用连续自然数之和来表达整数] 一个整数可以由连续的自然数之和来表示. 给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式. 输入描述 一个目标整数T (1 < ...

  6. 整数边界对齐方式_嵌入式基础——字节对齐

    字节对齐 一.内存访问对齐规则 从高级语言的视角看,内存访问是是字节为单位的. 但是从CPU角度看,内存访问粒度与指令有关,比如1字节访问,2字节访问,4字节访问,8字节访问等. 如果在编程过程中不注 ...

  7. JavaScript中判断为整数的多种方式

    JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的double类型一样.但实际操作中比如数组索引.位操作则是基于32位整数. 方式一.使用取余运算符判断 任何 ...

  8. 深入理解计算机系统(2.3)---整数的表示方式精解无符号与补码编码(重要)...

    本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer7.html 上一章我们简单的介绍了布尔代数以及C语言的位运算,本次我们主要来看,二进制如何表示 ...

  9. 深度解剖数据在内存中的存储!!数据在内存中原来是这样表示的?为什么浮点数和整数的存储方式差距这么大?

    文章目录 Data Storage 1. 数据类型 1.1 整型家族 1.2 浮点数家族 1.3 指针类型 1.4 构造类型 2. 整型在内存中的存储 2.1 二进制表示形式 2.1.1 正数 2.1 ...

最新文章

  1. 和12岁小同志搞创客开发:两个控制器之间如何实现通信?
  2. 彻底搞懂Java内存泄露
  3. 口碑扑街光环不在,2018将是苹果手机最难熬的年头!
  4. c51单片机跑马灯汇编语言,单片机跑马灯汇编程序 单片机汇编程序编写技巧
  5. Eclipse对于多个Java项目的支持并不友好!
  6. Linux下文件权限查看并使用chomd修改文件权限
  7. ASP.NET Core 集成测试
  8. MongoDB投影字段
  9. LeetCode 188. 买卖股票的最佳时机 IV(动态规划)
  10. 易语言 存储过程 mysql_在易语言中调用MS SQL SERVER数据库存储过程(Transact-SQL)方法总结...
  11. anaconda下载太慢怎么办_Windows10下anaconda成功运行Cython
  12. 详解Python中re.sub
  13. 安卓kali安装mysql_超详细安卓手机安装kali教程(root篇)
  14. 数据分析入门-第四天
  15. cocos creator切换场景闪退_#Cocos Creator# 为什么音乐音效在场景切换的时候自动停止了?...
  16. 秃头大牛一文竟然就把SpringCloudStream(SCS)给讲明白了?
  17. 建议先倒杯水,这次的货是真的干
  18. Python《机器学习实战》读书笔记(四)——朴素贝叶斯
  19. 微信开发.Net 接入示例
  20. 致自己:CSS学习笔记三

热门文章

  1. Rails Commands
  2. 华为手机大变?余承东被传离职转岗,进军美国受阻惹的祸?
  3. 微信联盟链接不到服务器怎么,LOL微信绑定方法及无法登录处理方案推荐
  4. 计算机无法读取内存,图文教你如何修复电脑无法识别读取的U盘(SD卡)!-内存卡在电脑上读不出来怎么办...
  5. 英语单词记忆以及句式记忆
  6. linux重命名乱码文件,Linux中重命名乱码文件
  7. Fabric 1.0源代码分析(31) Peer
  8. git----如何撤销上次提交
  9. 2021年JS解决那些有趣的数学题
  10. 微软裁员1万人,遣散费约54亿元,人均获赔54万!