nyoj1087——摆格子——————【规律题】

摆方格

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述

  给你一个n*n的方格,每个方格里的数必须连续摆放如  

,下图为不连续的,请输出从左上角到右下角的对角线上的最大和   

 
输入
输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
输出
每行输出占一行,输出最大的对角线之和。
样例输入
1
2
3
样例输出
1
6
19


解题思路:n的平方那个数字不在顶角位置。对角线上n-1个数字与n的平方成等差数列,顶角最小的那个值由对角线一侧的空格数来推算,也是根据空格构成等差数列来求,当然要去掉那些穿插的较大的数的个数(n-1)/2。

#include<stdio.h>
#define LL long long
int main(){

    LL n,a,b,ans;
    while(scanf("%lld",&n)!=EOF){

        a=n*(n-1)/2-(n-1)/2+1; //求顶角不构成等差数列那个数
        b=(n*n-(n-2))*(n-1); //对角线构成等差数列的和
        ans=a+b;
        printf("%lld
",ans);
    }
    return 0;
}

  

以n=4为例。对角线上,16的位置不是在右上角,而是留了一个顶角位置,12、14、16构成了等差数列。6可以由对角线左侧的空格个数来求得,即n*(n-1)/2为对角线左侧的空格个数,而由于会有13等较大的数的穿插,所以(n-1)/2即为所穿插的较大数的个数(可以写几组找下规律)。

原文地址:https://www.cnblogs.com/chengsheng/p/4384154.html