三角形
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=N,x=0以及y=0三线围成的一个直角三角形,请帮忙计算该三角形内(包括边上)的整点的个数,其中整点表示x,y都取整数的点。
Input
第一行输入一整数T,表示有T 组测试数据,接下来有T行,每行输入一个数N.(1<=T<=1000,1<=N<=100000000)
Output
对于每组数据,输出一行,用一个整数表整点个数。
Sample Input
5
1
2
3
10
1000000
Sample Output
2
4
6
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;
}