求卡特兰数前N项的和模M。

直接求必定是不可能的,卡特兰数太大了。想了好久,本打算把位数拆成素数相乘,然后记录下各素数的个数计算。可惜,TLE。。。。因为N太大了。

除法必定是要用到逆元的,但分母与M不一定互质。M拆成素数相乘形式,记录下各个素数在数组PRIME。于是,可以把4*i-2和i+1拆成素数相乘,若在PRIME中,则必定是与M不互质的,只能将个数记在NUM中,4*i-2的+1,i+1的-1。那么,把各素数约去后的i-1剩下的必与M互质。于是就可以和M求逆元的。

可以看程序,很容易懂。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #define LL __int64
  6. #define NP 30000
  7. using namespace std;
  8.  
  9. LL prime[NP];
  10. int num[NP],np;
  11.  
  12. void exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
  13. if(b==0){
  14. x=1; y=0;
  15. return ;
  16. }
  17. exgcd(b,a%b,x,y);
  18. __int64 t=x;
  19. x=y;
  20. y=t-a/b*y;
  21. }
  22.  
  23. void cal1(LL &ans,LL tp,LL &m){
  24. for(int i=0;i<np&&prime[i]<=tp;i++){
  25. if(tp%prime[i]==0){
  26. while(tp%prime[i]==0){
  27. num[i]++;
  28. tp/=prime[i];
  29. }
  30. }
  31. }
  32. ans=(ans*tp)%m;
  33. }
  34.  
  35. void cal2(LL &ans,LL tp,LL &m){
  36. LL x,y;
  37. for(int i=0;i<np&&prime[i]<=tp;i++){
  38. if(tp%prime[i]==0){
  39. while(tp%prime[i]==0){
  40. num[i]--;
  41. tp/=prime[i];
  42. }
  43. }
  44. }
  45. exgcd(tp,m,x,y);
  46. ans=(ans*((x%m+m)%m))%m;
  47. }
  48.  
  49. int main(){
  50. LL n,m;
  51. while(scanf("%I64d%I64d",&n,&m),n||m){
  52. LL tp=m; np=0;
  53. for(LL i=2;i*i<=tp;i++){
  54. if(tp%i==0){
  55. prime[np++]=i;
  56. while(tp%i==0)
  57. tp/=i;
  58. }
  59. }
  60. if(tp>1)
  61. prime[np++]=tp;
  62. memset(num,0,sizeof(num));
  63. LL ans=1,res=1,tmp;
  64. for(LL i=2;i<=n;i++){
  65. cal1(ans,4*i-2,m);
  66. cal2(ans,i+1,m);
  67. tmp=ans;
  68. for(int k=0;k<np;k++)
  69. if(num[k])
  70. for(int p=0;p<num[k];p++)
  71. tmp=(tmp*prime[k])%m;
  72. res=(res+tmp)%m;
  73. }
  74. printf("%I64d\n",res);
  75. }
  76. return 0;
  77. }

  

HDU 3240的更多相关文章

  1. HDU 4165

    一块药看成括号配对就行了.很明显的直接求卡特兰数. 今晚看了HDU 3240的题,有一点思路,但无情的TLE.想不到什么好方法了,看了别人的解答,哇...简直是天才的做法啊....留到星期六自己思考一 ...

  2. HDU 4455.Substrings

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  4. hdu 1598 find the most comfortable road (并查集)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. etymology-R

    1)vor = to eat devour vt. 狼吞虎咽地吃光: 吞没,毁灭: 目不转睛地看[de-向下+vour-吃] voracity  n.贪食,贪婪.拉丁词根vor-,vorac-表示吞食 ...

  2. HDU 1042 N!【大数】

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Subm ...

  3. iOS 相似QQ空间表视图下拉头部视图放大效果实现

    UITableView 是 UIScrollView 的子类. 所以 UIScrollView 的代理方法.在UITableView 上相同可以得到适用. 既然如此那么我们就行知道.在表格下拉的过程中 ...

  4. codecombat之KithGard地牢19-37关代码分享

    codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ...

  5. js保留两位小数的解决的方法

    var a = 123.456; a = a..toFixed(2); alert(a);//结果:123.46

  6. 0x29 总结与练习

    搜索真的菜..困扰了很久,上个星期天没休息好导致整个礼拜没有精神.. 大概完成得七七八八了吧.真是深切的体会到暴力出奇迹的疯狂啊. 3.虫食算 从末位开始枚举判断,通过加数可以推出和的字母代表的数.那 ...

  7. 【刷题笔记】LeetCode 606. Construct String from Binary Tree

    题意 给一棵二叉树,把它转化为字符串返回.转化字符串的要求如下: 1.  null 直接转化为  () ;(这个要求其实有点误导人~) 2. 子节点用 () 包裹起来:(这是我自己根据例子添加的要求) ...

  8. svn插件失效

    安装其他插件后,可能出现SVN插件失效了,在eclipse中完全找不到SVN的任何操作选项,此时可尝试通过以下办法解决: 把eclipse/configuration目录下的org.eclipse.u ...

  9. float类型和double类型的二进制存储

    在32位环境下, float占用32位,double占用64位, 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和  ...

  10. [转]SQL Server 数据库规范

    SQL Server 数据库规范 一. 命名规范常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文. 1. 表.英文单数名词,尽量写完整单词名称一般不超过3个英文单词都可 ...