题解:考虑按顺序从小到大,加入数字,将加入奇数位置看作入栈,加入偶数位置看作出栈。为什么可以?考虑我们要保证相邻奇数小于偶数,所以必须先填上一个奇数的位置才能填偶数的位置,既时刻保证奇数>=偶数,最终奇数等于偶数。观察到这个性质,我们应该联想到卡特兰数了,套用公式求解。本题模数可能为合数,不一定存在逆元!!所以,要分解开计算,最后合并起来。顺便试了下常数优化。。。然而本人代码太丑,怕是救不回来了。

#include <bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
int notp[2000007],num[2000007],nxt[2000007],n,P,p[2000007],tn;
void init() {notp[1]=1;nxt[1]=1; tn = (n<<1);for(register int i=1;i<=tn;++i) {if(!notp[i])p[++p[0]]=i,nxt[i]=i;for(register int j=1;j<=p[0]&&p[j]*i<=tn;++j) {notp[i*p[j]]=1;nxt[i*p[j]]=p[j];if(i%p[j]==0)break;}}
}
inline void add(ull a,ull v) {while(a != 1) {num[nxt[a]]+=v;a/=nxt[a];}
}
inline ull q_pow(ull a,int b) {ull ans=1;while(b) {if(b&1)ans=(ans*a)%P;a=(a*a)%P;b>>=1;}return (int)ans;
}
inline ull merge() {ull ans = 1;register int i;for( i=1; i<=p[0]; i+=3) {ans = (ans%P*q_pow(p[i],num[p[i]])%P)%P;ans = (ans%P*q_pow(p[i+1],num[p[i+1]])%P)%P;ans = (ans%P*q_pow(p[i+2],num[p[i+2]])%P)%P;}for(;i<=p[0];++i) ans = (ans%P*q_pow(p[i],num[p[i]])%P)%P;return ans%P;
}
inline void write(ull x) {if(x>=10)write(x/10);putchar(x%10+'0');
}
// (while) better than (for)
// (!=) better than (>)
// (int) better than (ull) better than (ll)
int main() {scanf("%d%d",&n,&P);init();for(ull i=1;i<=tn;++i) add(i,1);for(ull i=1;i<=n;++i) add(i,-2);add(n+1,-1);write(merge());
}

  

转载于:https://www.cnblogs.com/RRRR-wys/p/8935902.html

BZOJ1485: [HNOI2009]有趣的数列相关推荐

  1. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)

    [BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...

  2. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

    「BZOJ1485」[HNOI2009] 有趣的数列   Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...

  3. [HNOI2009]有趣的数列

    [HNOI2009]有趣的数列 有一个长度为2n的1~2n的全排列,保证其奇数项递增,偶数项递增,并且相邻的奇数项和偶数项,后面的偶数项大于奇数项的方案数\(mod\ p,n<=1000000, ...

  4. P3200 [HNOI2009]有趣的数列 (巧妙转换,卡特兰数,分解质因数取模运算)

    P3200 [HNOI2009]有趣的数列 分析: 这题是个思维题,通过打表也可以容易发现就是卡特兰数 讲一下,是如何巧妙的转换成卡特兰数的 由数列满足的三个条件,可以发现第 2i2i2i 位(偶数位 ...

  5. [HNOI2009] 有趣的数列

    题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<...<a2n ...

  6. 分解质因数-洛谷P3200 [HNOI2009]有趣的数列

    https://www.luogu.org/problem/show?pid=3200 首先,我们不能保证要求的数的逆元和模域互质: 所以我们要用分解质因数来抵消除法: 其实逆元的话即使可行也会超时: ...

  7. [Catalan数三连]网格有趣的数列树屋阶梯

    如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...

  8. P3200-[HNOI2009]有趣的数列【卡特兰数】

    正题 题目链接:https://www.luogu.com.cn/problem/P3200 题目大意 求一个长度为2∗n2*n2∗n的排列要求 奇数位和偶数位分别递增 相邻的偶数位大于奇数位 解题思 ...

  9. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

最新文章

  1. 给Source Insight做个外挂系列之五--Insight “TabSiPlus”
  2. 算法 --- 希尔排序、归并排序、快速排序的js实现
  3. printf函数输出超出int时怎么办
  4. reverse函数:反转容器内容
  5. android的时间代码怎么写,Android 日期和时间的使用实例详解
  6. PJSIP学习笔记——PJSUA层发起呼叫的主要流程
  7. Python依赖文件requirements.txt的生成和安装
  8. 【BZOJ1146】网络管理,整体二分
  9. bzoj3172:[Tjoi2013]单词
  10. 美国亚马逊账号被锁定之后
  11. windows 和 ubuntu服务器之间用Xshell互传文件
  12. 2018-2019-1 20165301 《信息安全系统设计基础》第六周学习总结
  13. 代码审计 JavaScript代码理解.
  14. SHA256算法原理介绍以及实现
  15. 械体叶NUNNECH FEWNE OFUEenTM 17.1+教程与算例
  16. 黑帽SEO研究之js快照劫持代码分析
  17. xpath跨级定位(parent::,following-sibling::, preceding-sibling)
  18. 费解的开关 Java
  19. C语言判断三角形类型
  20. java-assured_接口自动化测试(rest-assured)

热门文章

  1. c语言用递归法判断回文字符串,递归方式判断一个字符串是否为回文字符串
  2. 适合手机端的ckeditor样式_抖音运营干货(三):9款手机视频剪辑APP,让你轻松玩转后期!...
  3. linux java升级版本_为嵌入式Linux设备实现更新/升级系统
  4. 八大排序算法交换排序算法
  5. 一份【软件工程】的学习指南已到达,请注意查收!!
  6. [Java基础]自定义注解之属性定义
  7. [C++STL]常用查找算法
  8. [剑指offer]面试题42:翻转单词顺序 VS左旋转字符串
  9. 高等数学上-赵立军-北京大学出版社-题解-练习5.6
  10. chrome主题_谷歌Chrome将很快允许用户创建自定义主题