题目链接:http://acm.sgu.ru/status.php
题意:将n个有区别的球放到m个无区别的盒子里,盒子不能为空。不同的方案数。
思路:设f[i][j]表示将前i个球放到j个盒子里,那么f[i][j]=f[i-1][j]*j+f[i-1][j-1]。根据这个建立矩阵。
int n,m;
struct Matrix
{
i64 a[15][15];
void init(int x)
{
clr(a,0);
if(x)
{
int i;
FOR1(i,m) a[i][i]=1;
}
}
Matrix operator*(Matrix p)
{
Matrix ans;
ans.init(0);
int i,j,k;
FOR1(k,m) FOR1(i,m) FOR1(j,m)
{
ans.a[i][j]+=a[i][k]*p.a[k][j]%mod;
ans.a[i][j]%=mod;
}
return ans;
}
Matrix Pow(i64 n)
{
Matrix ans,p=*this;
ans.init(1);
while(n)
{
if(n&1) ans=ans*p;
p=p*p;
n>>=1;
}
return ans;
}
};
Matrix p;
int main()
{
Rush(n)
{
RD(m);
int i,j;
p.init(0);
FOR1(i,m) p.a[i][i]=i,p.a[i][i+1]=1;
p=p.Pow(n-1);
PR(p.a[1][m]);
}
}