首页 > 其他分享 >2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)

2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)

时间:2023-04-06 18:01:18浏览次数:48  
标签:组真题 gcd cnt b0 b1 input LCM GCD

2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)

本题的编码是用Python实现的,C++的思路也是相同的。

希望本文能够帮助到你!

题目:

暴力法:

直接根据题目的要求写:

from math import gcd
def lcm(a, b):
    return a*b//gcd(a, b)
n = int(input())
for _ in range(n):
    cnt = 0
    a0, a1, b0, b1 = map(int, input().split())
    for x in range(1, b1 + 1):
        # 如果b1不能被x整除,x肯定不满足要求。
        if b1 % x != 0: continue
        if gcd(x, a0) == a1 and lcm(x, b0) == b1:
            cnt += 1
    print(cnt)

代码中有个小细节:

# 如果b1不能被x整除,x肯定不满足要求。
if b1 % x != 0: continue

这样可以减少一些不必要的计算。

根据题意,时间复杂度大概是O(n**2),具体一点数据量会达到百亿级别❗️

而python本来就比较慢,暴力写法必定会跑不出来,必须要进行优化才行。

优化:

由题意知:x和b0的最大公倍数是b1,我们假设一个y,x * y == b1,y可能是答案。优化如下:

from math import gcd
def lcm(a, b):
    return a*b//gcd(a, b)
n = int(input())
for _ in range(n):
    cnt = 0
    a0, a1, b0, b1 = map(int, input().split())
    # 1 <= x <= sqrt(b1) <= y <= b1
    # x, y 可以取到1到b1的所有值。
    for x in range(1, int(b1**0.5)+1):
        if b1 % x != 0: continue
        y = b1 // x
        if gcd(x, a0) == a1 and lcm(x, b0) == b1:
            cnt += 1
        # 如果该数已经被判断过则跳过。
        if x == y: continue
        if gcd(y, a0) == a1 and lcm(y, b0) == b1:
            cnt += 1
    print(cnt)

具体的GCD和LCM手写法可以看这篇文章

若出现错误,欢迎指出。

祝大家在学习的道路上能取得大的进步!

标签:组真题,gcd,cnt,b0,b1,input,LCM,GCD
From: https://www.cnblogs.com/itduan/p/17293637.html

相关文章

  • gcd纯数学思维
    https://codeforces.com/contest/1766/problem/D题意找到连续的最长gcd(a+k,b+k)==1(a<b,k={0,1,2,...})思路:gcd(a+k,b+k)==gcd(a+k,b-a)a-b=1时特判可以推出gcd(a+k,b+k)==gcd(a+k,b-a),具体证明见https://codeforces.com/blog/entry/110066设两个的结......
  • gcd交互题
    https://codeforces.com/contest/1762/problem/D给一个长度为n的permutation,每次一个询问,得到结果为gcd(i,j),请在2*n次之内找到那个是0(或者哪两个之中之一是0)思路三个指针i,j,k(i<j<k)令x=gcd(a[i],a[j]),y=gcd(a[i],a[k]);如果x==y,显然a[i]>0如果x<y,可以证明a[j]>0如果x......
  • Landscape UI on Portait LCM (竖屏横用/直屏横用)使用
    1.直屏比橫屏便宜許多 2.Qwertykeypadphone(全键盘手机),客戶普遍用”直屏橫放“的方式來实现,但得自己承受performance和tearing(斜切屏)問題.因为使用LCM做90度Rotate,则必然出现斜切屏。3.MTK提供tearing-free(斜切屏解决方法)以及goodperformance。无需LCM......
  • 洛谷 P2398. GCD SUM
    题目描述求$$\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)$$输入:2输出:5算法1 线性筛 $O(n)$将式子变形:要知道一个前置定理$\sum\limits_{d|n}\varphi(d)=n$艾弗森约定:定义$\\\[P]$=$$\begin{cases}P\text{}is\text{}tr......
  • 2022年第十三届蓝桥杯大赛软件类决赛C/C++大学B组真题
    2022年第十三届蓝桥杯大赛软件类决赛C/C++大学B组真题卡牌constintN=2e5+10;piia[N];intsum;intb[N];intn,m;voidsolve(){ intmx=1e18,ans=0; cin>>n>>m; for(inti=1;i<=n;i++)cin>>a[i].first,a[i].second=i; for(inti=1;i<=n;i++)cin>>b[i......
  • 「解题报告」ARC122E Increasing LCMs
    紫题不会了,感觉要退役了前缀\(\mathrm{lcm}\)的限制很强,考虑每次消去一个数。发现最后一个数没有依赖,考虑最后一个数的条件,其实就是最后一个数不是前\(n-1\)个数的\(\mathrm{lcm}\)的倍数,即\(\displaystyle\gcd(\mathop{\mathrm{lcm}}_{i\nej}(a_j),a_i)<a_i\)。这......
  • interval GCD
    https://ac.nowcoder.com/acm/contest/1033/B 区间加,求区间gcd[L,R]  gcd(a[x],a[x+1],.....a[y])=gcd(a[x], a[x+1]-a[x],a[x+2]-a[x+1],.....a[y]-a[......
  • 【洛谷】P2257 YY的GCD(莫比乌斯反演)
    原题链接题意\(T\)组询问,每次询问求:\[\sum_{i=1}^{n}\sum_{i=1}^{m}[\gcd(i,j)\inprime]\]\(T=10^4,n,m\leq10^7\)。思路不难想到枚举质数,将原式化简为:\[\sum......
  • CF1665D GCD Guess
    个人思路:\(\gcd(x+a,x+b)=gcd(x+a,b-a)\)。考虑固定\(a\),然后试出来\(x+a\)所有因子。然后发现质数根本试不完。发现询问\(30\)次,\(2^{30}\)刚好比\(x\)大一......
  • 通过 sqlcmd 命令 + Windows 定时任务实现数据库的定时备份
    SQLServer2022Developer是一个全功能免费版本,许可在非生产环境下用作开发和测试数据库。公司用的SQLServer2022Express是SQLServer的一个免费版本,只有基础的......