首页 > 代码库 > Sicily 1302 Magic Square (数论)

Sicily 1302 Magic Square (数论)

链接:http://soj.me/1302

题目中有图和表格,所以就不把题目信息列出来了,打开链接直接看就行了。。。


分析:

从填幻方的过程,可以判断一下几点:
1>.幻方的每一列都是向下发展的;
2>.填入的前n个数都刚好是每一列第一个填入的数;
从这两点可以推出下面几点:
(1). 每一列的发展是平面的(即每一列的个数是一样的,特别的,只有一列少一);
(2). 右下角那个数肯定是填入的最大的;
(3). 当我们填入到右下角的时候,每一列的个数都刚好是n/2(注意n是奇数,这里的除是整除)


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int main()
{
    long long n;
    double m;
    while(~scanf("%lld", &n) && n) {
        if(n == 1) { puts("1"); continue; }
        m = n;
        printf("%0.0lf\n", (m*m+1)/2-(m+1)/2-1+0.1);
    }
    return 0;
}