大数乘法+加法。
这是借鉴网上的模板。
题目链接:​​​vjudgeUVA-10523​

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int base=10;
struct inter{
int num[maxn];
int cnt;
};
inter a,b;
//大数模拟加减法 ---模板可套用
//幂运算+求和
void muti(int k)//
{
for(int i=0;i<a.cnt;i++)
{
a.num[i]*=k;
}
int i;
for(i=0;i<a.cnt;i++)
{
a.num[i+1]+=a.num[i]/base;
a.num[i]%=base;
}//剩余之后
while(a.num[i])
{
a.num[i+1]+=a.num[i]/base;
a.num[i]%=base;
i++;
}
while(i>=0&&!a.num[i]) i--;//去零
a.cnt=i+1;
}
inter add(inter &x,inter &y)//相加
{
inter tmp;
memset(tmp.num,0,sizeof(tmp.num));
tmp.cnt=0;
for(int i=0, j=0, g=0; ; i++, j++)
{
if(g==0 && i>=x.cnt && j>=y.cnt) break;
int t = g;
if(i<x.cnt) t+= a.num[i];
if(j<y.cnt) t+= b.num[i]; //这个挺好
tmp.num[tmp.cnt++] = t%base;
g = t/base;
}
return tmp;
}
int main()
{
int N,A;
while(scanf("%d%d",&N,&A)!=EOF)
{
if(A==0)
{
printf("0\n");
continue;
}
memset(a.num,0,sizeof(a.num));
memset(b.num,0,sizeof(b.num));
b.cnt=a.cnt=0;
for(int i=1;i<=N;i++)
{
memset(a.num,0,sizeof(a.num));
a.cnt=1,a.num[0]=1;
for(int j=1;j<=i;j++)
muti(A);//累乘
muti(i);
b=add(a,b);
}
for(int i=b.cnt-1;i>=0;i--)
printf("%d",b.num[i]);
printf("\n");
}
return 0;
}

​参考链接1​​​
​​​参考链接2​