校内题目江城唱晚

1.江城唱晚
 
【题目背景】
墙角那株海棠,是你种下的思念。
生死不能忘,高烛照容颜。
一曲江城唱晚,重忆当年坐灯前,
青衫中绣着你留下的线。
——银临《江城唱晚》
【问题描述】
扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题。
歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海
棠,但是如今都已枯萎,只剩下那一株,寄托着对他深深的思念。
沿着墙一共有 n 个位置可以种下海棠花,主人公记得自己当年和他一共种下了 m
朵,由于花的特性,海棠不能紧挨着种植,也就是两朵海棠花之间最少间隔一个不种花
的空位置。但是她记不清当时海棠花具体是怎么摆放的了,所以她想知道一共有多少方
案使得 m 朵海棠花都被种下且两两之间不是相邻的。我们将这 m 朵海棠花按照
1,2,3…m 的顺序编号,两个种花的方案不同当且仅当它们被种下的位置不同或者从左向
右数花的编号序列不同。
为了避免输出过大,答案对一个参数 p 取模
【输入格式】
输入文件名为 ilove.in。
输入文件中有且仅有一组数据,只有一行四个数字,分别代表 type,n,m,p。其中
type 是一个帮助你判断测试点类型的参数,会在数据范围中说明。
【输出格式】
输出文件名为 ilove.out。
输出一行一个数字,代表答案对 p 取模的结果。
【输入输出样例 1】
ilove.in ilove.out
输入1 3 2 19260718
输出2

说实在的要是会式子你那个type没啥用。。
正解开始:
对于这个,你可以打一个深搜暴力来骗点分:详情请见洛谷题目选数;
关键在于,选数这道题用深搜暴力可以枚举每一种方案,但是这个题只是问方案数,并不需要具体到每一种;
那么除了深搜骗分,还可以推式子来搞这个题;
 
题目中说,对于两盆花,它们中间一定至少有一个空,对于m盆花,它们中间一定有m-1个空不能填
 
那么,把这m-1个空去除,剩下n-(m-1)也就是n-m+1个空,
 
从这n-m+1个空中选出m个空来放置花,用组合数

来计算。

对于上图每一种情况,都有

种不同的顺序排放,那么总数也就是

化简以后即为下文代码中的

代码:
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,type,p;
int main(){
    freopen("ilove.in","r",stdin);
    freopen("ilove.out","w",stdout);
    scanf("%d%d%d%d",&type,&n,&m,&p);
    long long ans=1;
    for(int i=n-2*m+2;i<=n-m+1;i++)
    {
        ans=(ans*i)%p;
    }
    printf("%lld",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/lbssxz/p/11082869.html