10674 等差对

10674 等差对

时间限制:1000MS  内存限制:65535K

题型: 编程题   语言: 无限制

 

Description

   今天是一个特别的日子,百年一遇的光棍节,2011.11.11,xym收到一个装着礼物的信封,是一位mm的XX书,里面是两个棒棒糖和一封信。
信里是一道智力题:
    定义如果<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个有序对中存在多少个等差对?
    但是xym因为昨晚听他们班的女生唱歌太晚睡觉了,严重影响状态,现在他只能请求各位scau未来的希望帮助他解决这个问题。

 

Input

第一行输入一个整数T(T<=1000),表示case数。
下面T行有T个case,每个case只有一个整数n(1<=n<=10^9),表示0<=x,y<=n;但是由于测试的时候发现用scanf("%lld",&n)有bug,所以为了修正这个bug,请各位用long long读入的同学在读入前先赋0给变量,
例如 long long n=0; scanf("%lld",&n);

Output

每个case输出一行,表示等差对的数量,这个结果可能很大,只需最后结果%20111111即可。

 

Sample Input

2
2
100

 

Sample Output

5
338350

 

Hint

注意不要让数据溢出,及时取模的处理







//分析:
其实这是一个利用矩阵来求解的问题,把x0-x1=y0-y1化成x0-yo=x1-y1,然后画出一个矩阵,关系很明显了
然后C(2,2)+C(2,3)+C(2,4)+...+C(2,n)=C(3,n+1),然后救出2*C(3,n+1)+C(2,n+1)即是所求
//以下为AC代码
#include<stdio.h>

void process()
{
	long long n=0,sum,sum2,min;
	scanf("%lld",&n);
	
	if((n-1)%3==0)
	{
		min=(n-1)/3;
		sum2 = ((n+1)*n%20111111)*min;
	}
	else if(n%3==0)
	{
		min=n/3;
		sum2 = ((n+1)*(n-1)%20111111)*min;
	}
	else
	{
		min=(n+1)/3;
		sum2 = (n*(n-1)%20111111)*min;
	}
	
	sum=(n*(n+1))/2 + sum2;
	printf("%lld\n",sum%20111111);
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--) process();
	return 0;
}

posted on 2012-11-10 01:07  Arcfat Tsui  阅读(331)  评论(0编辑  收藏  举报

导航