Description
Analysis
一眼递推。
当然,数据范围很大,要高精度。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,b,a) for(int i=b;i>=a;i--)
using namespace std;
const int N=1810;
int n,m;
struct bignum
{
int n,a[5005];
bignum(){}
bignum(int k)
{
n=0;
memset(a,0,sizeof(a));
if(k==0) n=1;
else
for(;k;k/=10) a[++n]=k%10;
}
void write()
{
fd(i,n,1) printf("%d",a[i]);
}
}l0,l1,t;
void add(bignum &c,bignum a,bignum b)
{
c=bignum(0);
c.n=max(a.n,b.n);
fo(i,1,c.n)
{
c.a[i]+=a.a[i]+b.a[i];
c.a[i+1]=c.a[i]/10;
c.a[i]%=10;
}
if(c.a[c.n+1]) c.n++;
}
void mul(bignum &c,bignum a,int k)
{
c=bignum(0);
c.n=a.n;
fo(i,1,c.n)
{
c.a[i]+=a.a[i]*k;
c.a[i+1]=c.a[i]/10;
c.a[i]%=10;
}
while(c.a[c.n+1]) c.n++;
}
int main()
{
scanf("%d %d",&n,&m);
l0=bignum(0),l1=bignum(m-1);
fo(i,2,n)
{
t=l1;
add(l1,l1,l0);
mul(l1,l1,m-1);
l0=t;
}
add(l0,l0,l1);
l0.write();
return 0;
}