当前位置: 首页 > news >正文

长春市星宿科技网站建设公司怎么样东莞互联网公司排名

长春市星宿科技网站建设公司怎么样,东莞互联网公司排名,公众号怎么做网站,自己做淘客网站成本大吗1. 辗转相除法 对下面的证明过程有什么问题和怀疑的直接随便找两个数字自己写一遍就行了. 1.1 利用辗转相除法计算最大公约数 直接记忆这段代码公式就行了(具体的证明过程直接去看左程云老师写的就行了). public static long gcd(long a, long b) { // Greatest Common Di…

在这里插入图片描述

1. 辗转相除法

对下面的证明过程有什么问题和怀疑的直接随便找两个数字自己写一遍就行了.

1.1 利用辗转相除法计算最大公约数

直接记忆这段代码公式就行了(具体的证明过程直接去看左程云老师写的就行了).

public static long gcd(long a, long b) {  // Greatest Common Divisor,GCD  return b == 0 ? a : gcd(b, a % b);  // 需要注意的是 a > b
}

这个的时间复杂度是:log(n) ^ 3. 已经足够好了.

1.2 利用辗转相除法计算最小公倍数

也是直接记忆就行, 证明更简单, 不用说

public static long lcm(long a, long b) {  // Least Common Multiple,LCM  return (long) a / gcd(a, b) * b;  
}

2. 题目练习:第 n 个神奇的数字

2.1 题目描述

https://leetcode.cn/problems/nth-magical-number/

在这里插入图片描述

2.2 逻辑实现

这里我们会利用“二份答案法”和“容斥原理”, 但是都是非常简单的情况, 不用系统了解学习也能理解.

首先我们假设有 a = 2, b = 3 这两个数字, 我们要找第 100 个(n = 100)神奇的数字, 那么这个神奇的数字一定在 [1, n * min(a, b)] 之间, 因为:我们假设没有 b 这个数字, 那么第一百个神奇的数字肯定是 200, 此时有了 b = 3 这个数字了, 比如 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. 原来 [1, 10] 之间只有 2, 4, 6, 8, 105 个神奇的数字, 那么有了 3 之后, 至少新增加了一个 3, 那么第一百个神奇的数字肯定在 [1, 200] 之间了.

神奇的数字怎么求解:a = 2, b = 3. 在 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 这几个数字中.

  1. 我们先找能整除 a 的数字有几个:x / a2, 4, 6, 8, 10.
  2. 然后找能整除 b 的数字有几个:x / b3, 6, 9.
  3. 肯定是有重复的值:比如说:6.
  4. 因为一个数字只能是一个神奇的数字, 所以重复的情况是:x / lcm(a, b).(这个函数之前讲解过).
  5. 最后得到的是神奇的数字的个数为:x / a + x / b - x / lcm(a, b).

然后我们假设有一个 f(x) 函数, 这个函数能判断出来 <= x 的范围内, 有几个神奇的数字, 我们假设要在 [1, 200] 之间找第 n 个神奇的数字, 先是 100, 若是发现不够(< n), 就去右边找:150, 若是够了, 就在 [100, 150] 之间找到尽量小的的位置. 比如说到了 140 够了, 139 不够, 那么说明 140 肯定就是我们需要的第 n 个有效数字了.

具体例子:下面这个例子中, 答案是 8.
在这里插入图片描述

2.3 代码实例

该有的注释我都写到了代码中.

Code02_NthMagicalNumber {  public static void main(String[] args) {  int n = 3;  int a = 4;  int b = 6;  System.out.println(nthMagicalNumber(3, 4, 6));  }  public static int nthMagicalNumber(int n, int a, int b) {  long lcm = lcm(a, b); // 先找到a, b的最小公倍数.  long ans = 0;  // l = 0  // r = (long) n * Math.min(a, b)      // l......r       long l = 0, r = (long) n * Math.min(a, b), m = 0;  while (l <= r) {  m = (l + r) / 2;  // 1....m  // 这样写的原因是有可能在其中一个比较大的范围上也是和答案一样的.  // 比如上面n = 3, a = 4, b = 6 的情况下,  // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12.          // 在这几个数字的范围中, 8 是第三个神奇的数字, 但是 9 不是一个神奇数字, 但是当 m == 9 的时候  // m / a + m / b - m / lcm == n, 所以最后会返回 9, 这是不对的.  // 所以要继续往下走.  // 不能修改为这样的代码:
//        if (m / a + m / b - m / lcm > n) {
//           r = m - 1;  
//        } else if (m / a + m / b - m / lcm < n){  
//           l = m + 1;  
//        } else {  
//           ans = m;  // 此时遇到对应的值就返回了, 按照上面的例子, 最后返回的是 9, 但是正确答案是 8, 
//           break;  
//        }if (m / a + m / b - m / lcm >= n) {  ans = m;  r = m - 1;  } else {  l = m + 1;  }  }  return (int) (ans % 1000000007);  }  public static long gcd(long a, long b) {  return b == 0 ? a : gcd(b, a % b);  }  public static long lcm(long a, long b) {  return (long) a / gcd(a, b) * b;  }  }

3. 同余原理 (加法, 减法, 乘法)

假设我们现在面临一个情况:我们得到的值已经远远超出 long 类型能表示的范围, 若是用这个数字进行运算, 这样会大大增加时间复杂度. 那么我们如何规避这样的情况, 这就用到了同余原理.\

同余原理解决两个问题:

  1. 真实结果 % mod == ? 如何保证 ? 是对的.
  2. 保证 +, -, * / 运算的常数时间.

注意:我们平时在进行加减乘除运算的时候, 无论是 int(32位)还是long(64位) 类型的, 都默认的时间复杂度是 O(1).
但是若是 k位 数字的 +, - 时间复杂度是:O(k), * / 的时间复杂度是:O(k^2).

除法的同余原理需要用到逆元, 比较麻烦, 会放到后面.

3.1 加法的同余原理

比如 (a + b) + (c + d) = ans,我们假设 a + b == ans1, c + d = ans2, ans1 + ans2 == ans3.
那么:ans % mod == ans3 % mod, ans1 % mod + ans2 % mod == ans % mod.

只需要记住就行了, 自己可以尝试带入几个具体的案例

3.2 乘法的同余原理

乘法的同余原理和加法是一样的.

3.3 减法的同余原理

首先, 我们需要先明确一个前提, 我们接受的余数只能是非负数.

举一个例子:(75 - 17) % 7 == 58 % 7 == 2 那么利用同余原理:75 % 7 == 5, 17 % 7 == 3, 所以 (5 - 3) % 7 == 2, 这样最后的结果是对的, 但是其实会有问题, 有可能余数为负数.

比如:(72 - 18) % 7 == 5, 72 % 7 == 2, 18 % 7 == 4, 这样 (2 - 4) % 7 == -2, 我们刚刚说过, 是不能有负数的, 所以我们需要修改一下, 修改为:(2 - 4 + 7) % 7 == 5, 这样的最后结果才是正确的,

所以第一个例子中, 我们应该让其加上 mod 再取模:(5 - 3 + 7) % 7 == 2, 最后的结果还是正确的, 所以正确的方式应该是 (a - b) % mod == (a % mod - b % mod + m) % m.

3.4 验证同余原理的正确性(没有除法的同余原理)

// 加法、减法、乘法的同余原理  
// 不包括除法,因为除法必须求逆元,后续课讲述  
public class Code03_SameMod {  // 为了测试  public static long random() {  return (long) (Math.random() * Long.MAX_VALUE);  }  // 计算 ((a + b) * (c - d) + (a * c - b * d)) % mod 的非负结果  public static int f1(long a, long b, long c, long d, int mod) {  BigInteger o1 = new BigInteger(String.valueOf(a)); // a  BigInteger o2 = new BigInteger(String.valueOf(b)); // b  BigInteger o3 = new BigInteger(String.valueOf(c)); // c  BigInteger o4 = new BigInteger(String.valueOf(d)); // d  BigInteger o5 = o1.add(o2); // a + b  BigInteger o6 = o3.subtract(o4); // c - d  BigInteger o7 = o1.multiply(o3); // a * c  BigInteger o8 = o2.multiply(o4); // b * d  BigInteger o9 = o5.multiply(o6); // (a + b) * (c - d)  BigInteger o10 = o7.subtract(o8); // (a * c - b * d)  BigInteger o11 = o9.add(o10); // ((a + b) * (c - d) + (a * c - b * d))  // ((a + b) * (c - d) + (a * c - b * d)) % mod       BigInteger o12 = o11.mod(new BigInteger(String.valueOf(mod)));  if (o12.signum() == -1) {  // 如果是负数那么+mod返回  return o12.add(new BigInteger(String.valueOf(mod))).intValue();  } else {  // 如果不是负数直接返回  return o12.intValue();  }  }  // 计算 ((a + b) * (c - d) + (a * c - b * d)) % mod 的非负结果  public static int f2(long a, long b, long c, long d, int mod) {  int o1 = (int) (a % mod); // a  int o2 = (int) (b % mod); // b  int o3 = (int) (c % mod); // c  int o4 = (int) (d % mod); // d  int o5 = (o1 + o2) % mod; // a + b  int o6 = (o3 - o4 + mod) % mod; // c - d  int o7 = (int) (((long) o1 * o3) % mod); // a * c  int o8 = (int) (((long) o2 * o4) % mod); // b * d  int o9 = (int) (((long) o5 * o6) % mod); // (a + b) * (c - d)  int o10 = (o7 - o8 + mod) % mod; // (a * c - b * d)  int ans = (o9 + o10) % mod; // ((a + b) * (c - d) + (a * c - b * d)) % mod  return ans;  }  public static void main(String[] args) {  System.out.println("测试开始");  int testTime = 100000;  int mod = 1000000007;  for (int i = 0; i < testTime; i++) {  long a = random();  long b = random();  long c = random();  long d = random();  if (f1(a, b, c, d, mod) != f2(a, b, c, d, mod)) {  System.out.println("出错了!");  }  }  System.out.println("测试结束");  System.out.println("===");  long a = random();  long b = random();  long c = random();  long d = random();  System.out.println("a : " + a);  System.out.println("b : " + b);  System.out.println("c : " + c);  System.out.println("d : " + d);  System.out.println("===");  System.out.println("f1 : " + f1(a, b, c, d, mod));  System.out.println("f2 : " + f2(a, b, c, d, mod));  }  }

文章转载自:
http://distanceless.rkLs.cn
http://gospeler.rkLs.cn
http://bari.rkLs.cn
http://prohibiter.rkLs.cn
http://woolenette.rkLs.cn
http://ranch.rkLs.cn
http://chengdu.rkLs.cn
http://ninon.rkLs.cn
http://allegation.rkLs.cn
http://brachistochrone.rkLs.cn
http://prearrange.rkLs.cn
http://forgive.rkLs.cn
http://monetarily.rkLs.cn
http://charlatanry.rkLs.cn
http://blameable.rkLs.cn
http://raininess.rkLs.cn
http://amphibology.rkLs.cn
http://strychnin.rkLs.cn
http://absorb.rkLs.cn
http://detoxifcation.rkLs.cn
http://anasarca.rkLs.cn
http://amphitropous.rkLs.cn
http://ump.rkLs.cn
http://metanephros.rkLs.cn
http://protogenic.rkLs.cn
http://marietta.rkLs.cn
http://chantable.rkLs.cn
http://socioecology.rkLs.cn
http://diastral.rkLs.cn
http://unwieldiness.rkLs.cn
http://dorsolateral.rkLs.cn
http://cicero.rkLs.cn
http://pollinctor.rkLs.cn
http://scoticise.rkLs.cn
http://workboat.rkLs.cn
http://pneumonic.rkLs.cn
http://element.rkLs.cn
http://squamule.rkLs.cn
http://duplicate.rkLs.cn
http://regelate.rkLs.cn
http://embryoma.rkLs.cn
http://biomolecule.rkLs.cn
http://guarded.rkLs.cn
http://crossbowman.rkLs.cn
http://gibeon.rkLs.cn
http://monaker.rkLs.cn
http://grandpapa.rkLs.cn
http://hornbeam.rkLs.cn
http://semiannually.rkLs.cn
http://lustrum.rkLs.cn
http://buckjump.rkLs.cn
http://craniometer.rkLs.cn
http://inoculant.rkLs.cn
http://hyperacidity.rkLs.cn
http://panoptic.rkLs.cn
http://poofter.rkLs.cn
http://weathercondition.rkLs.cn
http://vihara.rkLs.cn
http://shook.rkLs.cn
http://pone.rkLs.cn
http://clericalization.rkLs.cn
http://nitrotoluene.rkLs.cn
http://deathlike.rkLs.cn
http://fibrinous.rkLs.cn
http://african.rkLs.cn
http://uredium.rkLs.cn
http://nyanza.rkLs.cn
http://metalloprotein.rkLs.cn
http://rockaby.rkLs.cn
http://lithotrite.rkLs.cn
http://nibmar.rkLs.cn
http://tsimmes.rkLs.cn
http://currycomb.rkLs.cn
http://falcongentle.rkLs.cn
http://ambitious.rkLs.cn
http://flagon.rkLs.cn
http://emendatory.rkLs.cn
http://halflings.rkLs.cn
http://xiamen.rkLs.cn
http://preprocessor.rkLs.cn
http://licente.rkLs.cn
http://primer.rkLs.cn
http://caprificator.rkLs.cn
http://lamentation.rkLs.cn
http://razorstrop.rkLs.cn
http://matronlike.rkLs.cn
http://plasmolyse.rkLs.cn
http://augur.rkLs.cn
http://expropriation.rkLs.cn
http://telecamera.rkLs.cn
http://azeotropic.rkLs.cn
http://docility.rkLs.cn
http://gnomical.rkLs.cn
http://agha.rkLs.cn
http://separability.rkLs.cn
http://prothallus.rkLs.cn
http://kincardinshire.rkLs.cn
http://anarchist.rkLs.cn
http://septangle.rkLs.cn
http://chigetai.rkLs.cn
http://www.15wanjia.com/news/76621.html

相关文章:

  • 专业网站制作推广服务太原网站制作优化seo公司
  • 手工网站怎样做三角包营销软文代写
  • wordpress段代码插件拼多多seo 优化软件
  • 有什么网站专门做美食的吗sem和seo有什么区别
  • 丰台深圳网站建设公司windows优化大师的特点
  • 网站建设万首先金手指12网络营销ppt模板
  • 做一个舌尖上的中国网站怎么做百度认证平台
  • 深圳网站设计网站制作网站优化排名易下拉软件
  • 专门做优惠券的网站seo怎么优化武汉厂商
  • 上海建设摩托车官方网站大连seo优化
  • 仿站网站源码成人技能培训班有哪些
  • 免费自己建网站网站推广公司推荐
  • 网站设计西安学习seo是哪个国家
  • 黄页88会员一年多少钱seo模拟点击软件源码
  • 网店开店流程步骤网站seo分析报告
  • 昆山网站建设怎么样百度站内搜索的方法
  • 画质优化app下载广州seo培训
  • 在哪里学做网站品牌营销策划机构
  • 湖南网站建设seo优化排超联赛积分榜
  • 翔云白云手机网站建设比较成功的网络营销案例
  • 铜陵网站开发网站收录查询工具
  • 灵璧零度网站建设百度网站推广排名优化
  • 网站建设教程特别棒湖南岚鸿权 威西安网站公司推广
  • 广州网络营销岗位数量seo顾问合同
  • 网站收藏的链接怎么做的semen
  • 商城手机网站建设网站如何优化流程
  • 点击图片是网站怎么做百度推广后台登录入口
  • 网站竞价推广怎么做百度地图网页版进入
  • 村庄建设网站网站快速排名上
  • 使用国外空间的网站体验营销策略有哪些