感谢教主。。
a[k]= k^x * x^k;
a[k+1]=(k+1)^x * x^(k+1) = x * (k+1)^x * x^k;
对于(k+1)^x来说,必须由k^0,k^1,k^2……k^x,来推出;
所以构建 f[k]=【x^k, k^1 * x^k, k^2 * x^k, k^3 * x^k, ……,k^x * x^k , s[k-1]】 s[n]表示前n项和
f[k+1]=【x^(k+1), (k+1)^1 * x^(k+1), (k+1)^2 * x^(k+1),……, (k+1)^x * x^(k+1) ,s[k]】
(k+1)^2=k^2 + 2*k + 1; (1,2,1)
(k+1)^3=k^3 + 3*k^2 + 3*k + 1;(1,3,3,1)
……(1,4,6,4,1)
杨辉三角形 a[i][j]=a[i][j-1]+a[i-1][j-1];
构建矩阵:
x x x x x x ……0
0 x 2x 3x 4x ……0
0 0 x 3x 6x ……0
0 0 0 x 4x ……0
0 0 0 0 x ……1
…………… ……1
然后矩阵快速幂。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll __int64
struct node
{
ll a[55][55];
}I,T;
ll n,x,m,i,j,k;
node cheng(node A,node B)
{
node C;
memset(C.a,0,sizeof(C.a));
for(i=0;i<=x+1;i++)
for(j=0;j<=x+1;j++){
for(k=0;k<=x+1;k++)
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%m;
}
return C;
}
int main()
{
while(cin>>n>>x>>m)
{
if(n==-1&&x==-1&&m==-1) break;
memset(I.a,0,sizeof(I.a));
memset(T.a,0,sizeof(T.a));
for(i=0;i<=x+1;i++)
I.a[i][i]=1;
for(i=0;i<=x;i++)
T.a[0][i]=T.a[i][i]=x%m;
for(i=1;i<=x;i++)
for(j=i+1;j<=x;j++)
T.a[i][j]=(T.a[i][j-1]+T.a[i-1][j-1])%m;
T.a[x+1][x+1]=T.a[x][x+1]=1;
while(n>0)
{
if(n&1) I=cheng(I,T);
n=n>>1;
T=cheng(T,T);
}
ll ans=0;
for(i=0;i<=x;i++)
ans=(ans+I.a[i][x+1]*(x%m))%m;
cout<<ans<<endl;
}
}