我连普及题都不会做力
原题:
n<=2e6,m<=1e6,p不一定使质数,保证答案不为0
经典高考题,推公式的时候又想起了高四数学老师用枚举法莽高考组合题的画面
怀念啊
首先可以发现树的排列和种的位置是相互独立的
那么就先求出所有排列方法,然后把坑往里放
肯定先给每相邻两个树中间放一个,然后就是不同盒子放相同球的问题
这里需要注意:不同盒子相同球的方案数不是n^m,应该用插板法
(如此简单的错误并不妨碍我出现)
然后你会惊喜的发现没法求组合数,因为p不一定是质数不能做除法,而nm都很大不能做递推……
事实上,如果把整个答案表达式可以发现组合数的两个分母可以约掉一个,那就可以暴力求了
这就说到本题的另一个做法
先给每相邻两个数分一个坑,把它看作宽为2的一个数
剩下的就是一个单纯的排列问题,从n-m+1个不同的坑里有顺序地选出m个。。。
如此地简单hhh
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define LL long long 5 LL o,n,m,p; 6 int main(){ 7 cin>>o>>n>>m>>p; 8 LL bwl=1; 9 n-=m-1; 10 for(int i=n-m+1;i<=n;++i) bwl=bwl*i%p; 11 cout<<bwl<<endl; 12 return 0; 13 }