ACM复习(43)10674 等差对

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

猜你喜欢

转载自blog.csdn.net/sinat_34200786/article/details/79616132