1869: Mathematics and Geometry

这是郑州轻工业学校的一次校赛的校内选拔赛,看名字是计算几何 的题

题目地址:

http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1869

 

Description

给你一个n,求方程 2x + y + 2z = n 解的个数,其中x, y, z, n 都是非负整数

**********************以下是我的思路********************************

最开始的时候,我是想要用双重循环来做。枚举  x  和  y ,结果是肯定的  TLE

{     /* 代码我就不拿出来丢人了*/   }

{   /*中间的胡思乱想略去*/}

 

最后我想到了把方程放到     3维 的直角坐标系中 2x + y + 2z = n  其实是一个平面,而问题的解可以转化为在    “第一卦限内平面上整数点的个数”  

巧的是  y  的系数是  1。于是把平面向  XZ 平面内投影(得到一个三角形区域,在这个三角形区域内的整数点都是平面上的整数点的投影),然后计算

XZ 二维平面上的三角形区域内的点的个数就是解。(更巧的是   x 和 z  的系数也是一样的,这样的话平面内点的计数就成了从  1 到(n/2 +1)的连续和,

如果 x 和 z 的系数不一样,那么解也应该是某个等差数列的和)

再说明一下,因为  y  的系数是1 ,所以才有  ”在这个三角形区域内的整数点都是平面上的整数点的投影“  (x 和 z 都是整数,n也是 ,那么  y=n-2*(x+z)  也是整数

 

 

# include <stdio.h>
typedef long long int LL;
LL n,ans;
int t;

int main(){
    
    scanf("%d",&t);
    for(int i=0;i<t;++i){
        scanf("%lld",&n);
        n=n/2+1;
        
        if(n%2==0){
        ans=n/2*(n+1);
        }else{
        ans=(n+1)/2*n;
        }
        printf("Case #%d: %lld\n",i+1,ans);
    }
    return 0;
}

 

 

 

 

 

posted @ 2016-04-12 18:25  _Ade  阅读(136)  评论(0编辑  收藏  举报