考试T1CE...

最近不适合考试

T1

扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题。
歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海
棠,但是如今都已枯萎,只剩下那一株,寄托着对他深深的思念。
沿着墙一共有 n 个位置可以种下海棠花,主人公记得自己当年和他一共种下了 m
朵,由于花的特性,海棠不能紧挨着种植,也就是两朵海棠花之间最少间隔一个不种花
的空位置。但是她记不清当时海棠花具体是怎么摆放的了,所以她想知道一共有多少方
案使得 m 朵海棠花都被种下且两两之间不是相邻的。我们将这 m 朵海棠花按照
1,2,3…m 的顺序编号,两个种花的方案不同当且仅当它们被种下的位置不同或者从左向
右数花的编号序列不同。
为了避免输出过大,答案对一个参数 p 取模

这道题一看就是DP嘛...

是个数学题

就是有n个位置,m个不同物品,问m个物品都不相邻的摆法有几种,其中m小于ceil(n/2),就是n/2上取整
思路分析:

思路一:

骗分输出最小的良心防爆零样例

思路二:

打神搜,其实T2,T3也可以这样操作,时间不够了...只拿了十分

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned int ui;
ui type,n,m,p;
inline ui arr(const ui &k){
ui ans=;
for(ui i=;i<=k;i++)
ans=(ans*(i%p))%p;
return ans;
}
int ans;
inline void search(const int &step,const int &pos){
if(step==m){
ans++;
return;
}
for(int i=;i<=n;i++){
if(pos+i<=n&&step+<=m) //没有上下界剪枝
search(step+,pos+i);
}
}
int main(){
freopen("ilove.in","r",stdin);
freoprn("ilove.out","w",stdout); //大家注意这一行的freopen!!!!!!(目力呐喊!!!)
scanf("%d%d%d%d",&type,&n,&m,&p);
for(int i=;i<=n-(m-)*;i++) //遍历每个可能的点找可能的路线,所以非常慢,只能处理范围在20以内的点
search(,i);
cout<<ans*arr(m);
return ;
}

思路三(正经思路):

一开始的思路是考虑n个位置选m个位置再减去相邻情况,然而这并不好代码实现,而且最大数据范围是n<=2000000,m<=1000000,然而组合数最广为人知的求法要么是前缀和(杨辉三角),要么是公式计算,

前缀和算法会因为数据范围而时间爆炸,公式计算因为取模运算的存在而正确性爆炸...

双倍爆炸,双倍快乐,算法两开花!!!

前缀和的爆炸原因不解释,有目共睹...

下面讲下关于组合数取模的错误的原因:

现给出组合数计算公式(并不想百度百科...):


本式值即为在n个互不相同的东西中取m个的方案总数

并且可以直观的看出该值的直接公式运算需要除法的参与,

已知四则运算中的加减乘满足“一边算一边模还保证正确性”定律(瞎起的名字)

除可不可以?

那么现在考虑如下式子:

15/21 (mod 20)

15/7   (mod 3)

14/6   (mod 3)

如果把分子分母分别进行模运算再除,得到的值显然不正确,

那么现在就要考虑乘法逆元了

整除也不行(考虑15/5 (mod 7))

所以要么把乘法逆元板子搬过来,要么就把运算全都变成乘运算

现在考虑推一个保证正确的式子再将其尽可能的化简

现有m个不同物品摆在n个位子,那么就有n-m个空位

现在保证正确的方案就是把这几个空位固定,在它们之间插空摆物品,以保证每两个物品之间至少有一个空位

如图:

每两点的中间(包括最边上的两点之外那两条线)就是合法方案的可选位置

那么就是n-m+1个位置中选择m个位置摆物品,在考虑物品的排列顺序就好了

就是这样:

又知:

辣么它们的乘机化简下,就是这样滴:

那么剩下的只有乘法运算辣!

最后说一点,由于模数最大好像是109,所以要开long long,并且由于本题经过分析后数据范围就相当于很小了,所以不用专门写函数加上inline加速,根本没必要...

代码(及其简短):

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,p;
long long type; //当时type为什么要开long long
int main(){
scanf("%d%d%d%d",&type,&n,&m,&p); //type变量用来判别测试点类型(骗分的)
long long ans=;
for(int i=n-*m+;i<=n-m+;i++)
ans=ans*i%p;
printf("%d\n",ans);
return ;
}

考试T1总结(又CE?!)的更多相关文章

  1. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  2. 某考试 T1 arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...

  3. 某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...

  4. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  5. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  6. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  7. 某考试 T1 str

    一开始死磕sam,发现根本没法做...... 后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊! 就是假设我们要让 s1[1] 映射到 ...

  8. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

  9. 某考试 T1 Hello my friend

    Discription

随机推荐

  1. 前端project师必需知识点

    1.HTML 2,CSS 3,JavaScript 4.JQuery 5.JSON 6,HTML DOM 7.AJAX 进阶教程: 1.Bootsrap 2,sea.js 3,node.js 4.An ...

  2. poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法

    Description Some major cities have subway systems in the form of a tree, i.e. between any pair of st ...

  3. chrome浏览器调试线上文件映射本地文件

    chrome浏览器调试线上文件映射本地文件 通过ReRes让chrome拥有路径映射的autoResponse功能. 前端开发过程中,经常会有需要对远程环境调试的需求.比如,修改线上bug,开发环境不 ...

  4. 王立平--SQLite,SQLiteOpenHelper的简单应用

    Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类.在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承 ...

  5. linux驱动之LED驱动_1

    步骤: 1.框架 2.完好硬件的操作: a.看原理图.引脚 b.看2440手冊 c.写代码: IO口须要用ioremap映射 我的板子电路例如以下所看到的 1.配置GPBCON 寄存器,配置输出   ...

  6. jQuery 插件开发全解析

    jQuery插件的开发包含两种: 一种是类级别的插件开发,即给jQuery加入新的全局函数,相当于给jQuery类本身加入方法.jQuery 的全局函数就是属于jQuery命名空间的函数,还有一种是对 ...

  7. 在oracle中操作表及字段注释,查询一个表的所有字段名以及属性和约束

    1.查询表注释 SELECT * FROM USER_TAB_COMMENTS; 三列:TABLE_NAME,TABLE_TYPE,COMMENTS 2.查询字段注释 SELECT * FROM US ...

  8. TeX中的引号

    #include <stdio.h> #include <math.h> // 算法竞赛的目标是编程对任意输入均得到正确的结果. // 请先独立完成,如果有困难可以翻阅本书代码 ...

  9. String Successor(模拟)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3490 题意:给出一个字符串,一个操作次数,每次操作从当前字符串最右边的字符 ...

  10. ARM VM安装Linux Diagnostic 2.3扩展

    目前创建的Azure Linux虚拟机默认安装的是LAD 3.0,如果客户有特殊需求,可以通过如下方法安装LAD 2.3 1.在Azure Portal卸载LAD 3.0 2.使用Azure Powe ...