zoukankan      html  css  js  c++  java
  • 校内题目江城唱晚

    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;
    }
  • 相关阅读:
    实现一个最简单的flask应用程序
    python常识
    Flex布局
    ES6的promise的学习
    通过正则获取url参数
    dom0级事件和dom2级事件
    sea.js总结
    跨域的几种方式
    人生苦短,生命也就一次,机会也就一次
    新开的博客先和大家打个招呼吧!
  • 原文地址:https://www.cnblogs.com/lbssxz/p/11082869.html
Copyright © 2011-2022 走看看