【洛谷5520】青原樱

我连普及题都不会做力

原题:

 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 }
View Code
原文地址:https://www.cnblogs.com/cdcq/p/12647257.html