注册 登录
编程论坛 数据结构与算法

请教大家没算法解出此题增加效率

wanghuijide 发布于 2011-12-03 13:35, 503 次点击
定义如果<x0,y0>和<x1,y1>满足x0-x1=y0-y1,则称这两个为等差对。
mm的问题是,问在<x,y>(0<=x,y<=n)<0,0>,<0,1>…<1,0>,<1,1>…<2,0>,
<2,1>…<n,0>…<n,1>…这(n+1)^2个有序对中存在多少个等差对?
第一行输入一个整数T(T<=1000),表示case数。
下面T行有T个case,每个case只有一个整数n(1<=n<=10^9),表示0<=x,y<=n
每个case输出一行,表示等差对的数量,这个结果可能很大,只需最后结果%20111111即可。
我的代码暴力超时
      while(T--)
    {
        s=0;
        scanf("%lld",&n);
        s+=((n%20111111)*(n+1)%20111111)%20111111/2;
        for( i=n;i>1;i--)
        {
            s+=(i%20111111)*((i-1)%20111111)%20111111;
        }
        s%=20111111;
        printf("%lld\n",s);
    }
1 回复
#2
silent_world2011-12-08 16:25
其实,这仅仅是要归纳为一个公式而已。
可以考虑(x,y)中,以y - x作为间距,就可以得到一个矩阵,以5个为例

     0,1, 2, 3, 4,
     -1,0, 1, 2, 3,
    -2, -1, 0, 1, 2,
    -3, -2, -1, 0, 1,
    -4, -3, -2, -1, 0

查看其斜对角线,无论T值为多少,仅仅右上角和左下角两个没有等差对。共有等差对数为:2T - 3个
1