三角形

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 137   Accepted Submission(s) : 90

Font: Times New Roman | Verdana | Georgia 

Font Size: ← →

Problem Description

平面上有 x+2*y=Nx=0以及y=0三线围成的一个直角三角形,请帮忙计算该三角形内(包括边上)的整点的个数,其中整点表示x,y都取整数的点。 

Input

第一行输入一整数T,表示有组测试数据,接下来有T行,每行输入一个数N.(1<=T<=1000,1<=N<=100000000) 

Output

对于每组数据,输出一行,用一个整数表整点个数。 

Sample Input

10 

1000000

Sample Output

36

250001000001

 

思路:

思路1:本题一看题,可以想到用生成函数解决,但是推导过程比较复杂,最后推算结果为:当n为奇数:(n+1)(n+3)/4;当n为偶数: (n+2)(n+2)/4;。

思路2:其实对于r=0,1,2...n,直线x+2*y=r上的整点个数就是不定方程x+2*y=r的非负整数解的个数Ar,,最后把所有的相加就是结果!由于本题数据题比较小,所以直接这样枚举做也可以过.

思路3:如果细心,可以看到本题可以用Pick定理解决,但是本题中如果n取奇数时,与y轴的交点不是整点,所以可以先把n乘以2,再用Pick定理,最后结果再作处理就可以了.(本题还可以推广,如果是ax+by=n,也可以用pick定理,可以在两边乘以a,b的最小公倍数,这样在x,y轴的交点都是整点,用满足pick的条件,最后结果再处理就可了.)

代码1:

#include"stdio.h"
int main()
{
    __int64 n,t;
    scanf("%I64d",&t);
    while(t--)
    {
      scanf("%I64d",&n);
      if(n%2==1)
      {
      printf("%I64d\n",(n+1)*(n+3)/4);
      }
      else
      {
           printf("%I64d\n",(n+2)*(n+2)/4);
      }
    }
  
    return 0;
}
 代码2:
#include<stdio.h>
#include<stdlib.h>
int n;
int t;
long long num;
int main()
{
   scanf("%d",&t);
   while(t--)
   {
      num=0;
      scanf("%d",&n);
   for(int x=0;x<=n;x++)
   num+=(n-x)/2+1;
   printf("%lld\n",num);
   }  
   system("pause");
   return 0;
}