题目
我的分析:
不知道为什么会错?
首先进行问题转化,恰好m个满足在所谓的正确的位置,那么其余n-m个不在。则结果为 C(m,n)* (n-m)个不在正确位置的情况个数。
问题转化为求有x个数,放在x位置,均不在正确位置的个数,
以B表示。寻找B(x)与B(x-1)之间的关系,
B(x):表示x均不在位置,B(x-1):表示x-1个均不在位置
则不满足均不在位置的情况为,即有在正确位置的。
B(x-1)X C(1,x)+B(x-2)X C(2,x)+。。。
x!- 这些
然后,竟然有错:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
cin>>num;
for(int nn=0;nn<num;nn++)
{
int m,n;
cin>>m>>n;
int t=m-n;
//求t 个不在原来位置上。
//杨辉三角 求c
int A[t+1][t+1];
memset(A,sizeof(A),0);
A[0][0]=1;
A[1][0]=1;
A[1][1]=1;
for(int i=2;i<t+1;i++)
{
A[i][0]=1;
for(int j=1;j<i;j++)
{
A[i][j]=A[i-1][j]+A[i-1][j-1];
A[i][j]=A[i][j]%1000000007;
}
A[i][i]=1;
}
// 1000000007
int B[t+1];
memset(B,sizeof(B),0);
B[2]=1;
int xx=2;
for(int i=3;i<t+1;i++)
{
for(int j=2;j<i;j++)
{
B[i]=((A[i][i-j]*B[j])%1000000007+B[i])%1000000007;
}
xx=xx*i%1000000007;
B[i]=(B[i]+1)%1000000007;
B[i]=(xx-B[i]+1000000007)%1000000007;
}
cout<<B[50]<<endl;
//求 c (n,m)
long long cc=1;
for(int iii=1;iii<=n;iii++) cc=(((cc*(m-iii+1))%1000000007)/iii)%1000000007;
cout<<B[t]*cc%1000000007<<endl;
}
}
哭了,为什么不对?放弃。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
cin>>num;
for(int nn=0;nn<num;nn++)
{
int m,n;
cin>>m>>n;
int t=m-n;
//求t 个不在原来位置上。
unsigned long long B[t+1];
memset(B,sizeof(B),0);
B[0]=0;
B[2]=1;
B[3]=2;
for(int i=4;i<t+1;i++)
{
B[i]=(i-1)*(B[i-1]+B[i-2])%1000000007;
}
unsigned long long cc=1;
for(int iii=1;iii<=n;iii++) cc=(((cc*(m-iii+1)))/iii)%1000000007;
cout<<B[t]*cc%1000000007<<endl;
}
}