微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Codechef 问题 给定整数 N 和 M,找到满足 1≤a<b≤N 和 ((M mod a) mod b) = ((M mod b) mod a) 的有序对 (a,b) 的数量

如何解决Codechef 问题 给定整数 N 和 M,找到满足 1≤a<b≤N 和 ((M mod a) mod b) = ((M mod b) mod a) 的有序对 (a,b) 的数量

到目前为止我所做的就是这些 我正在尝试以更短的时间优化代码。但它不起作用。

for _ in range(int(input())):
n,m = map(int,input().split())
count = 0
for i in range(1,n+1):
    for j in range(1,n+1):
        if i < j <= n and ((m%i)%j) == ((m%j)%i):
            count += 1
print(count)

我尝试的另一种方法

if i < j <= n and (m-(m%j))%i == 0:

两个条件都给出了正确的结果。但显示超出时间限制

我该怎么办。谢谢

解决方法

由于a

N = 2304
M = 23498


def fast():
    npairs = 0
    nfactors = [1] * (M + 1)
    for b in range(2,N + 1):
        npairs += nfactors[M - M % b]
        for i in range(0,M + 1,b):
            nfactors[i] += 1
    return npairs


def naive():
    return sum((M % a) % b == (M % b) % a for b in range(2,N + 1) for a in range(1,b))


print(fast(),naive())
,

认为 x%mod(a) 与 x%mod(b) 相同,只有条件 a

(n-1) 用于所有 1 对

for _ in range(int(input())):

    n,m=map(int,input().split())

    count=0

    dictitems=defaultdict(int)

    for i in range(2,n+1):

        rem=m%i

        count+=dictitems[rem]

        for j in range(rem,n+1,i):

            dictitems[j]+=1

    print(count+(n-1))

,

您的方法是一个好的开始,但需要精确地进行 N * N 次迭代。

您可以从以下改进开始。

  1. 对数据进行排序

  2. 使用 2 指针方法优化第二个指针的搜索范围

for i in range(1,n+1):
    for j in range(i+1,n+1): # note j start at `i+1`

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。