您的位置:首页 > 其它

ACM复习(43)10674 等差对

2018-03-19 19:26 399 查看
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未来的希望帮助他解决这个问题。

输入格式

第一行输入一个整数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);

输出格式

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

输入样例

2

2

100

输出样例

5

338350

提示

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

解题思路



这里计算前可以先把6除去,6 = 2 * 3,三个分子里面怎么也能找到这两个因子吧?

#include<stdio.h>
int main()
{
int t;
long long n, x, y, z, total;
scanf("%d", &t);
while(t --)
{
scanf("%lld", &n);
x = n;
y = n + 1;
z = 2 * n + 1;
if(x % 2 == 0)
x /= 2;
else
y /= 2;
if(x % 3 == 0)
x /= 3;
else if(y % 3 == 0)
y /= 3;
else
z /= 3;
total = (((x % 20111111) * (y % 20111111)) % 20111111) * (z % 20111111) % 20111111;
printf("%lld\n", total);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: