鸟题目 ...代码写的超难看,终于过了。。。
#include<iostream>
#include<cstring>
using namespace std;
const int mod=1000000007;
class NoRepeatPlaylist{public:
long long int dp[111];
bool vis[111];
long long int c[111][111];
bool you[111][111];
long long int cc(int x,int y)
{
if(y==0)
{
return 1;
}
if(y==1)
{
return x;
}
if(x==y)
{
return 1;
}
if(you[x][y])
{
return c[x][y];
}
else
{
you[x][y]=true;
c[x][y] = cc(x-1,y) + cc(x-1,y-1);
c[x][y] %= mod;
return c[x][y];
}
}
long long int f(int n,int m,int p)
{
if(m + 1 > n)
{
return 0;
}
long long ans=1;
long long temp;
for(long long int i=n;i>=n-m;i--)
{
ans*=i;
ans%=mod;
}
temp = n - m ;
for(long long int i=1;i<=p-m-1;i++)
{
ans*=temp;
ans%=mod;
}
return ans;
}
long long int x(int n,int m ,int p)
{
if(m+1>n)
{
if(p!=n)
return 0;
else
{
long long int temp=1;
for(int i=n;i>=1;i--)
{
temp*=i;
temp%=mod;
}
return temp;
}
}
if(vis[n])
{
return dp[n];
}
else
{
long long int temp=0;
for(int i=1;i<=n-1;i++)
{
temp += cc(n,i)*x(i,m,p);
temp %=mod;
}
dp[n]=f(n,m,p) - temp;
while(dp[n]<0)
{
dp[n]+=mod;
}
dp[n]%=mod;
vis[n]=true;
return dp[n];
}
}
long long int numPlaylists(int n, int m, int p)
{
memset(vis,false,sizeof(vis));
memset(you,false,sizeof(you));
return x(n,m,p);
}
};