UVa 10177 - (2/3/4)-D Sqr/Rects/Cubes/Boxes?

曾经放了好久的题,今天A掉了,其实就是推公式了,唯一觉得被坑了就是在windows下long long占位符是%I64d,而UVa用的貌似是linux,为此WR了一次,查了
一下,改成%lld后AC了。
题目解法:
对于正方形正方块来说,比较好找找规律,比如边长是4的二维下的正方形就是:1+4+9+25=39.即:前面所有边长的平方和,三维四维的相应的就是三次方和四次方。
对于边不同长的长方形长方体来说,就要推公式:
可以发现,一个图形中,边长为1的边长在每条最大的边上有n个可选位置,比如:边长为2(即:输入n=2时),每条最大边上有n(n=2)个边长为1的小边的可选位置,每条最大边上有n-1(n-1=1)个边长为2的小边的可选位置,以此类推...所以矩形所有可能边长个数是{n +(n-1)+...+2+1} = n*(1+n)/2,从中任意选出两种可能
就可以组成一个矩形。之后再减去,可能出现的边长相等的情况,便为长方形的个数 ~

代码如下:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>

using namespace std;

int main()
{
#ifdef test
    freopen("in.txt", "r", stdin);
#endif
    int num;
    long long int s2, r2, s3, r3, s4, r4;
    while(scanf("%d", &num) != EOF)
    {
        s2 = r2 = s3 = r3 = s4 = r4 = 0;
        for(int i = 1; i <= num; i++)
        {
            s2 += i * i;
            s3 += i * i * i;
            s4 += i * i * i * i;
        }
        long long int m = num * (num + 1) /2;
        r2 = m * m - s2;
        r3 = m * m *m - s3;
        r4 = m * m * m * m -s4;
        printf("%lld %lld %lld %lld %lld %lld\n", s2, r2, s3, r3, s4, r4);
    }
    return 0;
}


你可能感兴趣的:(windows,linux,图形)