我需要帮助找出解决这个问题的更好方法(可能是一个更数学的方法!)。以下是详细信息:
问题陈述:
给定 N 和 M,您需要找出有多少对 a,b (1 <= a < b <=N) 使得 (a+b) 可以被 M 整除。例如,当 N=4 和 M=3 ,有 2 个可能的对,它们的总和可以被 M 整除,它们是 (1,2) 和 (2,4)。
约束:1 <= N <= 10^9 和 2 <= M <= 10^9。 时间限制:1秒
在我的算法中,我循环了 N 次,使其成为 O(N) 算法。这是代码:
#include <stdio.h>
typedef unsigned long long ULL;
int main()
{
int t,m,n,a; ULL ans=0;
scanf("%d\n",&t);
while(t--) // test cases
{
// Main logic
scanf("%d %d",&n,&m);
ans=0;
for(a=1;a<n;a++)
ans += (n+a)/m - (a*2)/m;
printf("%llu\n",ans);
}
return 0;
}
我只是检查在 (2a,n+a) 范围内有多少数可以被 M 整除,其中 1 =< a < n。如果您查看范围内所有(a,b)的总和,您就会知道我为什么选择(2a,n+a)。
然而,这种O(N)方法并不是很快。对于 N=10 9和 M=2,程序在 12 秒内将答案打印为 249999999500000000,这非常慢。还可以使用哪些其他方法?我想不出更好的方法。请帮忙!