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) 编辑 收藏 举报