题目背景

国王1带大家到了数字王国的中心:三角圣地。

题目描述

不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成。这个倒三角的顶端有一排数字,分别是1~N。1~N可以交换位置。之后的每一行的数字都是上一行相邻两个数字相加得到的。这样下来,最底端就是一个比较大的数字啦!数字王国称这个数字为“基”。国王1希望“基”越大越好,可是每次都自己去做加法太繁琐了,他希望你能帮他通过编程计算出这个数的最大值。但是这个值可能很大,所以请你输出它mod 10007 的结果。

任务:给定N,求三角形1~N的基的最大值 再去 mod 10007。

输入输出格式

输入格式:

一个整数N

输出格式

一个整数,表示1~N构成的三角形的最大的“基”

思路:

其实这道题大家画个图就会发现,1~n个数在他们自己位置上的权值是杨辉三角形第n行

由于可以交换位置,所以将最大的放在中间即可

于是开始算了

一开始,我用的递推组合数直接求一行杨辉三角形

50分??

哦,1000000太大了,递推会出锅

好吧,Lucas来一发

还是50分??

好吧,TLE出锅了

怎么办呢?
看来只能预处理阶乘了。。。

心累。。

递推版:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. long long n,m,p,t,ans[1000010],ny[1000010],out;
  5. void qny()
  6. {
  7. ny[1]=1;
  8. for(register int a=2;a<=n;a++)
  9. {
  10. ny[a]=(p-(p/a))*ny[p%a]%p;
  11. }
  12. }
  13. int main()
  14. {
  15. scanf("%d",&n);
  16. p=10007;
  17. qny();
  18. m=(n+1)/2;
  19. ans[0]=1;
  20. for(register int i=1;i<=m-1;i++)
  21. {
  22. ans[i]=ans[i-1]*(n-i)*ny[i]%p;
  23. }
  24. for(register int i=2;i<=n;i+=2)
  25. {
  26. long long ltt=i+i-1;
  27. ltt%=p;
  28. ltt*=ans[i/2-1];
  29. ltt%=p;
  30. out+=ltt;
  31. out%=p;
  32. }
  33. if(n%2==1)
  34. {
  35. long long ltt=n*ans[m-1]%p;
  36. out+=ltt;
  37. out%=p;
  38. }
  39. cout<<out;
  40. }

Lucas朴素版:

  1. // luogu-judger-enable-o2
  2. #include<iostream>
  3. #include<cstdio>
  4. #define rii register int i
  5. using namespace std;
  6. unsigned long long n,m,p,t,ny[100010],out;
  7. void qny()
  8. {
  9. ny[1]=1;
  10. for(register int a=2;a<=p;a++)
  11. {
  12. ny[a]=(p-(p/a))*ny[p%a]%p;
  13. }
  14. }
  15. int zhs(int q,int x)
  16. {
  17. if(q==0)
  18. {
  19. return 1;
  20. }
  21. long long ltt=1;
  22. for(register int a=1;a<=q;a++)
  23. {
  24. ltt*=ny[a];
  25. ltt%=p;
  26. }
  27. for(register int a=1;a<=q;a++)
  28. {
  29. ltt*=(x-a+1);
  30. ltt%=p;
  31. }
  32. return ltt;
  33. }
  34. long long lucas(int s,int t)
  35. {
  36. if(t==0)
  37. {
  38. return 1;
  39. }
  40. else
  41. {
  42. return (lucas(s/p,t/p)*zhs(s%p,t%p))%p;
  43. }
  44. }
  45. int main()
  46. {
  47. scanf("%d",&n);
  48. p=10007;
  49. qny();
  50. for(rii=1;i<=n;i+=2)
  51. {
  52. if(i==n)
  53. {
  54. out+=lucas(i/2,n-1)*(i);
  55. }
  56. else
  57. {
  58. out+=lucas(i/2,n-1)*(i*2+1);
  59. }
  60. out%=p;
  61. }
  62. cout<<out;
  63. }

正解:

  1. #include<iostream>
  2. #include<cstring>
  3. #define rii register int i
  4. using namespace std;
  5. int p=10007;
  6. long long jc[10010],ny[10010],n,ans;
  7. void ycl()
  8. {
  9. jc[0]=1;
  10. jc[1]=1;
  11. ny[0]=1;
  12. ny[1]=1;
  13. for(rii=2;i<=p-1;i++)
  14. {
  15. jc[i]=jc[i-1]*i%p;
  16. }
  17. for(rii=2;i<=p-1;i++)
  18. {
  19. ny[i]=(p-p/i)*ny[p%i]%p;
  20. }
  21. for(rii=1;i<=p-1;i++)
  22. {
  23. ny[i]=ny[i-1]*ny[i]%p;
  24. }
  25. }
  26. long long lucas(long long h,long long j)
  27. {
  28. if(h<j)
  29. {
  30. return 0;
  31. }
  32. if(h<p&&j<p)
  33. {
  34. return jc[h]*ny[j]%p*ny[h-j]%p;
  35. }
  36. return lucas(h/p,j/p)*lucas(h%p,j%p)%p;
  37. }
  38. int main()
  39. {
  40. ycl();
  41. cin>>n;
  42. for(rii=1;i<=n;i++)
  43. {
  44. if(i%2==0)
  45. {
  46. ans=(ans+(i*lucas(n-1,n-i/2))%p)%p;
  47. if(ans<0)
  48. {
  49. ans+=p;
  50. }
  51. }
  52. else
  53. {
  54. ans=(ans+(lucas(n-1,(i+1)/2-1)*i)%p)%p;
  55. if(ans<0)
  56. {
  57. ans+=p;
  58. }
  59. }
  60. }
  61. cout<<ans;
  62. }

  

《瞿葩的数字游戏》T3-三角圣地(Lucas)的更多相关文章

  1. 【刷题】洛谷 P2675 《瞿葩的数字游戏》T3-三角圣地

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1 ~ N.1 ~ N可以交换位置. ...

  2. 【luoguP2675】《瞿葩的数字游戏》T3-三角圣地

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1~N.1~N可以交换位置.之后的每 ...

  3. LUOGU P2675 《瞿葩的数字游戏》T3-三角圣地

    题面 解题思路 手推可以得出,最后每个数字的贡献其实就是第n行杨辉三角数,然后直接卢卡斯直接算(今天才找到lucas定理时间复杂度是log n,log以模数为底).代码略麻烦,不想改了. 代码 #in ...

  4. P2675 《瞿葩的数字游戏》T3-三角圣地

    传送门 考虑最上面每个位置的数对答案的贡献 然后就很容易发现: 如果有n层,位置 i 的数对答案的贡献就是C( n-1,i ) 然后就有很显然的贪心做法: 越大的数放越中间,这样它的贡献就会尽可能的大 ...

  5. 题解 P2674 【《瞿葩的数字游戏》T2-多边形数】

    题目说了很清楚,此题找规律,那么就找规律. 我们观察数列. 令k表示数列的第k个数. 三角形数:1 3 6 10 15 两项相减:1 2 3 4 5 再次相减:1 1 1 1 1 四边形数:1 4 9 ...

  6. C语言猜数字游戏

    猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...

  7. 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II

    好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...

  8. java 猜数字游戏

    作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...

  9. 【原创Android游戏】--猜数字游戏Version 0.1

    想当年高中时经常和小伙伴在纸上或者黑板上或者学习机上玩猜数字的游戏,在当年那个手机等娱乐设备在我们那还不是很普遍的时候是很好的一个消遣的游戏,去年的时候便写了一个Android版的猜数字游戏,只是当时 ...

随机推荐

  1. CSS垂直居中的四种方法

    写在前面的话 最近在Stack Overflow上看到 一个不错的回答 ,以下是我对其的总结,分享给大家. 垂直居中的四种方法 ①基础的方法 设置父元素的line-height等于height,这种方 ...

  2. js 正则表达式简易教程

    (http://www.cnblogs.com/tugenhua0707/p/5037811.html#_labe6)

  3. wxpython,wx.EVT_ENTER_WINDOW

    这个例子是鼠标移入,button的label显示“Over Me”,但是我运行没有显示求怎么回事

  4. JsonConvert序列化问题

    返回的Json数据如下: [[1400025600,9633460,9667535,2698.09,2734.73,2749,2698.08,25333.3057,11784.9,13548.4,69 ...

  5. 向jsp页面传值时出现乱码

    在一个html页面中用表单向jsp页面传值: 这是html页面 <html> <head> <title>MyBeans.html</title> &l ...

  6. 华为OJ-表示数字

    要求:将一个字符中所有出现的数字前后加上符号"*",其他字符保持不变 #include<iostream> #include<string> using n ...

  7. Selenium2学习(十三)-- JS处理滚动条

    前言 selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候 ...

  8. python 学习 (迟到的2017小结)

    2017过去了,从前端开发转测试,入行一年多,写了web的UI自动化测试框架,看了python基础教程,核心编程,算是入门python了吧.目前呢,想开发个接口的自动化测试平台.           ...

  9. 3元购买微信小程序解决方案一个月

    一.登录微信公众平台https://mp.weixin.qq.com/ 二.点击立即注册.注意:这里不要用微信公众号登录,小程序账号和微信公众号是不同的. 三.在注册页面点击小程序板块. 四.进入小程 ...

  10. php文件编程

    一:文件常见操作 流的概念:当数据从程序(内存)->文件(磁盘),我们称为输出流,当数据从文件(磁盘)->程序(内存),我们称为输入流 1,获取文件信息 <?php //打开文件 f ...