数据量这么大一看就是有公式,而且肯定要用大数
ans=n*(n-1)+2
用到了大数乘法,减法,加法。
要特别注意乘法开的数组要求是最大的乘数的两倍以上。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 205
using namespace std;
void BigAdd(char *a,char *b,char *back)
{
char c[MAXN];
int p=0,up=0;
for(int i=strlen(a)-1,j=strlen(b)-1; i>=0||j>=0;--i,--j)
{
int x,y,z;
if(i<0) x=0;
else x=a[i]-'0';
if(j<0) y=0;
else y=b[j]-'0';
z=x+y+up;
if(z>9) up=1;
else up=0;
c[p++]=z%10+'0';
}
if(up) c[p++]='1';
c[p]=0;
int q=0;
for(int i=p-1; i>=0; --i) back[q++]=c[i];
back[q]=0;
}
void BigSub(char *a,char*b,char*back)
{
char c[MAXN];
int down=0,p=0;
for(int i=strlen(a)-1,j=strlen(b)-1; i>=0; --i,--j)
{
int x,y,z;
x=a[i]-'0';
if(j<0) y=0;
else y=b[j]-'0';
z=x-y+down;
if(z<0)
{
down=-1;
z+=10;
}
else down=0;
c[p++]=z+'0';
}
c[p]=0;
int q=0;
bool ok=false;
for(int i=p-1; i>=0; --i)
{
if(c[i]!='0') ok=true;
if(ok) back[q++]=c[i];
}
back[q]=0;
}
void BigMult(char *a,char *b,char *back)
{
int res[MAXN]= {0};
for(int i=strlen(a)-1,I=0; i>=0; --i,++I)
for(int j=strlen(b)-1,J=0; j>=0; --j,++J)
res[I+J]+=(a[i]-'0')*(b[j]-'0');
int L=strlen(a)+strlen(b)+1;
for(int i=0; i<=L; ++i)
{
res[i+1]+=res[i]/10;
res[i]=res[i]%10;
}
int p=0;
bool ok=false;
for(int i=L; i>=0; --i)
{
if(res[i]) ok=true;
if(ok) back[p++]=res[i]+'0';
}
if(!ok) back[p++]='0';
back[p]=0;
}
int main()
{
char str[MAXN];
while(scanf("%s",str)!=EOF)
{
if(!strcmp(str,"0"))
{
puts("1");
continue;
}
char a[MAXN],b[MAXN],c[MAXN];
BigSub(str,"1",a);
BigMult(str,a,b);
BigAdd(b,"2",c);
puts(c);
}
return 0;
}