如何解决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
次迭代。
您可以从以下改进开始。
-
对数据进行排序
-
使用 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 举报,一经查实,本站将立刻删除。