topcoder srm 531 div2 600pt

来源:互联网 发布:抢鞋软件 编辑:程序博客网 时间:2024/05/01 19:53

鸟题目 ...代码写的超难看,终于过了。。。

#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);}};


原创粉丝点击