我昨天举行了比赛。我无法解决下面的问题。我在比赛结束后看到一个人的解决方案,我无法理解。他是如何在如此短的时间内完成的。他申请了什么。请解释他的解决方案。
您将获得两个号码
N
和K
以及一组X
。
X = { x : x is a natural number ≤ N }
你必须找到总数 属于给定元素的元素对X[i]
和X[j]
的数量 设置,i < j
及其总和可以被K
整除。输入格式:
整数
T
后跟T
行,每行包含一对空格 分隔整数N
和K
。输出格式:
T
整数分开。每个整数表示答案 对应于该测试用例。约束:
1≤T≤100
K≤N≤10^9
1≤K≤10000
示例输入(明文链接)
2 10 4 7 3
示例输出(明文链接)
10 7
解释
对于第一个测试用例,有10对,其总和可被4整除。 (1,3),(1,7),(2,6),(2,10),(3,5),(3,9),(4,8),(5,7),(6) ,10)和 (7,9)
对于第二个测试用例,有7对,其总和可以被3整除。 (1,2),(1,5),(2,4),(2,7),(3,6),(4,5)和(5,7)
解决方案 -
#include<stdio.h>
int main()
{
long long int t,n,m,x,y,c=0;
scanf("%lld",&t);
while(t--)
{
scanf("%lld %lld",&n,&m);
c=0;
x=n/m;
y=n%m;
c+=((x*x*(m-1)-((m%2==0)?x:0))+x*(x-1))/2+y*x;
if(y>m/2)
c+=y-m/2;
printf("%lld\n",c);
}
}
答案 0 :(得分:0)
<强>提示强>
蛮力方法:
您可以在0<i<N
和i<j≤N
上写一个双循环,并计算(i + j) % K == 0
对的对。
更聪明的方法:
对于给定的i
,j
的数量使(i + j) % K == 0
等于约(N - i) / K
,因为每K
个数字是{{的倍数1}}。 (由您来完善精确表达式的近似值。)
更聪明的方法:
使用之前的结果,您需要对所有K
的{{1}}贡献求和。此表达式对于(N - i)/K
的{{1}}个连续值保持不变,并从i
(即K
)减少到i
(即i=1
),步骤~N/K
。因此,总计数将类似于i=N
,其中0
表示1
三角形数字K.T(N/K)
。
(同样,您需要将近似值精确到精确值并找到一个封闭的公式。)
示例:
T(m)