重排问题 (Arrange the Numbers,UVa 11481)

 1 #include <iostream>
 2 #include <string.h>
 3 #include <string>
 4 #include <fstream>
 5 #include <algorithm>
 6 #include <stdio.h>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 #include <cmath>
11 using namespace std;
12 const double eps = 1e-8;
13 const double pi=acos(-1.0);
14 const int INF=0x7fffffff;
15 unsigned long long uINF = ~0LL;
16 #define MAXN 1007
17 #define mod 1000000007
18 typedef long long LL;
19 LL c[MAXN][MAXN];
20 LL a[MAXN];
21 void init()
22 {
23     memset(c,0,sizeof(c));
24     c[0][0]=a[0]=1;
25     for(LL n=1;n<=1000;n++)
26     {a[n]=(a[n-1]*n)%1000000007;
27         for(LL k=0;k<=n;k++)
28         {
29             if(k){c[n][k]=(c[n-1][k]+c[n-1][k-1])%mod;}
30             else {c[n][k]=1;}
31             //cout<<c[n][k]<<' ';
32         }
33         //cout<<endl;system("pause");
34     }
35     //cout<<c[1000][1000]<<endl;
36 }
37 int main()
38 {
39     //freopen("0.in","r",stdin);
40     init();
41     int n,m,k,T,t=1;
42     scanf("%d",&T);
43     while(T--)
44     {
45         scanf("%d%d%d",&n,&m,&k);
46         LL ans=0;
47         LL tempn,tempa,sum=0;
48         for(int i=1;i<=m-k;i++)
49         {
50             tempn=c[m-k][i];
51             tempa=a[n-k-i];
52             if(i&1)
53             {
54             sum+=((tempn%mod)*(tempa%mod))%mod;
55             sum+=mod;
56             sum%=mod;
57             }
58             else
59             {
60             sum-=((tempn%mod)*(tempa%mod))%mod;
61             sum+=mod;
62             sum%=mod;
63             }
64         }
65         ans=a[n-k]-sum+mod;
66         ans%=mod;
67 
68         ans*=c[m][k];
69         ans%=mod;
70         //if(ans<0)ans+=mod;
71         printf("Case %d: %lld\n",t++,ans);
72     }
73 
74     return 0;
75 }

容斥原理~

#include <iostream>
#include <string.h>
#include <string>
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <set>
#include <cmath>
using namespace std;
const double eps = 1e-8;
const double pi=acos(-1.0);
const int INF=0x7fffffff;
unsigned long long uINF = ~0LL;
#define MAXN 1007
#define mod 1000000007
typedef long long LL;
LL c[MAXN][MAXN];
LL a[MAXN];
void init()
{
    memset(c,0,sizeof(c));
    c[0][0]=a[0]=1;
    for(LL n=1;n<=1000;n++)
    {a[n]=(a[n-1]*n)%1000000007;
        for(LL k=0;k<=n;k++)
        {
            if(k){c[n][k]=(c[n-1][k]+c[n-1][k-1])%mod;}
            else {c[n][k]=1;}
            //cout<<c[n][k]<<' ';
        }
        //cout<<endl;system("pause");
    }
    //cout<<c[1000][1000]<<endl;
}
int main()
{
    //freopen("0.in","r",stdin);
    init();
    int n,m,k,T,t=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&k);
        LL ans=0;
        LL tempn,tempa,sum=0;
        for(int i=1;i<=m-k;i++)
        {
            tempn=c[m-k][i];
            tempa=a[n-k-i];
            if(i&1)
            {
            sum+=((tempn%mod)*(tempa%mod))%mod;
            sum+=mod;
            sum%=mod;
            }
            else
            {
            sum-=((tempn%mod)*(tempa%mod))%mod;
            sum+=mod;
            sum%=mod;
            }
        }
        ans=a[n-k]-sum+mod;
        ans%=mod;

        ans*=c[m][k];
        ans%=mod;
        //if(ans<0)ans+=mod;
        printf("Case %d: %lld\n",t++,ans);
    }

    return 0;
}

posted @ 2013-07-27 08:35  TO_Asia  阅读(394)  评论(0编辑  收藏  举报