Vijos 黑皮的正方形 (找规律+高精)

背景

金堂人杰地灵,金玉满堂!金堂中学就是这金玉满堂之中一颗璀璨的明珠!黑皮就在金堂最有名的金堂中学求学....

描述

一天他不务正业出去耍,看见街上的地板是由很多小的正方形组成,顿时心里突发奇想想要总结一下到底有多少正方形。。。。

于是乎,他狠下心数了数,终于翻山越岭知道了正方形的总边长为N,你的目的是找出在可以组成的每个至少边为1的正方形的个数。(因为黑皮太笨了,无法找到)。。

格式

输入格式

自然数(0<=n<=32767)

输出格式

一个数,即正方形的总数

样例1

样例输入1

2

样例输出1

5

限制

各个测试点1s

提示

本题太简单了,na上来个大家,解解烦~~~~
《呵呵》

 

 

 1 /*
 2     规律不难找 就是a[i]=a[i-1]+i*i 
 3     就是 n有点大 long long只过两个点 
 4     只好打高精了 
 5 */
 6 #include<cstdio>
 7 #include<cstring>
 8 #include<iostream>
 9 #define ll long long
10 #define MAXN 1010
11 
12 using namespace std;
13 
14 int n;
15 int a[MAXN],b[MAXN],c[MAXN];
16 
17 inline void cc(ll p) {
18     memset(b,0,sizeof b);
19     while(p) {
20         int t=p/10;
21         b[++b[0]]=p-t*10;
22         p/=10;
23     }
24     return;
25 }
26 
27 inline void pluss() {
28     c[0]=max(b[0],a[0])+1;
29     for(int i=1;i<=c[0];i++) {
30         c[i]+=a[i]+b[i];
31         if(c[i]>=10) {
32             c[i+1]+=c[i]/10;
33             c[i]%=10;
34         }
35     }
36     while(c[0]>0&&!c[c[0]]) c[0]--;
37     for(int i=0;i<=c[0];i++) a[i]=c[i];
38     memset(c,0,sizeof c);
39 }
40 
41 int main() {
42     scanf("%d",&n);
43     a[0]=1;
44     a[1]=1;
45     for(int i=2;i<=n;i++) {
46         cc(i*i);
47         pluss();
48     }
49     for(int i=a[0];i>=1;i--) printf("%d",a[i]);
50     printf("\n");
51     return 0;
52 }
代码

 

posted @ 2017-07-03 15:59  拿叉插猹哈  阅读(333)  评论(0编辑  收藏  举报