无法理解竞争性考试?

时间:2016-01-09 16:34:12

标签: c algorithm

我昨天举行了比赛。我无法解决下面的问题。我在比赛结束后看到一个人的解决方案,我无法理解。他是如何在如此短的时间内完成的。他申请了什么。请解释他的解决方案。

  

您将获得两个号码NK以及一组X

     

X = { x : x is a natural number ≤ N }你必须找到总数   属于给定元素的元素对X[i]X[j]的数量   设置,i < j及其总和可以被K整除。

     

输入格式:

     

整数T后跟T行,每行包含一对空格   分隔整数NK

     

输出格式:

     

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);
    }
}

1 个答案:

答案 0 :(得分:0)

<强>提示

蛮力方法:

您可以在0<i<Ni<j≤N上写一个双循环,并计算(i + j) % K == 0对的对。

更聪明的方法:

对于给定的ij的数量使(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)