公式求值

输入n, m, k,输出图1所示的公式的值。其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数。组合数的计算公式如图2所示。

输入的第一行包含一个整数n;第二行包含一个整数m,第三行包含一个整数k。

计算图1所示的公式的值,由于答案非常大,请输出这个值除以999101的余数。

【样例输入1】

3

1

3

【样例输出1】

162

【样例输入2】

20

10

10

【样例输出2】

359316

【数据规模与约定】

对于10%的数据,n≤10,k≤3;

对于20%的数据,n≤20,k≤3;

对于30%的数据,n≤1000,k≤5;

对于40%的数据,n≤10^7,k≤10;

对于60%的数据,n≤10^15,k ≤100;

对于70%的数据,n≤10^100,k≤200;

对于80%的数据,n≤10^500,k ≤500;

对于100%的数据,n在十进制下不超过1000位,即1≤n<10^1000,1≤k≤1000,同时0≤m≤n,k≤n。

【提示】

999101是一个质数;

当n位数比较多时,绝大多数情况下答案都是0,但评测的时候会选取一些答案不是0的数据;

资源约定:

峰值内存消耗(含虚拟机) < 128M

CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。







这道题附上一个思路方便读者了解

Lucas定理加上一些数学处理转换。直接给大家个链接吧http://tieba.baidu.com/p/2832505865。重点可以看看

十四楼对这道题的处理方法,还是不太懂的话可以草稿纸上演算演算。注意dp[i][j]代表第i次求导后(xj)*(1+x)(n-j)的系数。然后具体写代码的时候,方法返回类型尽量处理为long,能取模就取模,尽量少用大数直接加减乘除运算操作,不然后面的数据会超时(我一开始就直接用大数写,最后两个点超时了,前面几个点也比较灵异地出现了错误答案)。其他标程逆元部分似乎是利用费马小定理,然后a^(p-2)模p为a模p的逆元,而我是直接利用扩展欧几里得求a模p的逆元。对了,还要注意lucas定理利用时,如果c(n%p,m%p)中n%p<m%p,则值应直接返回0而不是1(这就是那个测试点的问题所在)

  1. import java.math.BigInteger;
  2. import java.util.Scanner;
  3. class Number {
  4. long x,y,dd;
  5. /**
  6. * @param x
  7. * @param y
  8. * @param dd
  9. */
  10. public Number(long x, long y, long dd) {
  11. super();
  12. this.x = x;
  13. this.y = y;
  14. this.dd = dd;
  15. }
  16. /**
  17. *
  18. */
  19. public Number() {
  20. super();
  21. // TODO Auto-generated constructor stub
  22. }
  23. }
  24. public class Main {
  25. static BigInteger n, m;
  26. static int k;
  27. static long monum = 999101;
  28. static BigInteger mobig = new BigInteger("999101");
  29. static BigInteger big2 = new BigInteger("2");
  30. static long ansnum1,ans;
  31. static long dp[][], bignum[], subnum[];
  32. static long fact[];
  33. private static Number gcd(long a,long b) {
  34. if (b==0) return new Number(1,0,a);
  35. Number number=gcd(b, a%b);
  36. long x=number.y;
  37. long y=number.x-(a/b)*number.y;
  38. long dd=number.dd;
  39. return new Number(x,y,dd);
  40. }
  41. private static long mod_inverse(long num) {
  42. if (num==0) return 0;
  43. Number number=gcd(num, monum);
  44. long x=(number.x+monum)%monum;
  45. return x;
  46. }
  47. private static long cal(BigInteger num) {
  48. if (num.equals(BigInteger.ZERO)) return 1;
  49. if (num.equals(BigInteger.ONE)) return 2;
  50. long mnum = cal(num.divide(big2));
  51. mnum = mnum*mnum%monum;
  52. BigInteger mo = num.mod(big2);
  53. if (mo.equals(BigInteger.ONE))
  54. mnum=mnum*2%monum;
  55. return mnum;
  56. }
  57. private static void init() {
  58. fact = new long[(int) (monum + 1)];
  59. fact[0] = 1;
  60. for (int i = 1; i <= monum; i++)
  61. fact[i]=(fact[i-1]*(long)i)%monum;
  62. }
  63. private static long calc(int n,int m) {
  64. if (n<m) return 0;
  65. long mo=fact[m]*fact[n-m]%monum;
  66. long divnum=mod_inverse(mo);
  67. long res=fact[n]*divnum%monum;
  68. return res;
  69. }
  70. private static long lucas(BigInteger n,BigInteger m){
  71. if (m.equals(BigInteger.ZERO)) return 1;
  72. int nmo=n.mod(mobig).intValue();
  73. int mmo=m.mod(mobig).intValue();
  74. return calc(nmo, mmo)*lucas(n.divide(mobig),m.divide(mobig))%monum;
  75. }
  76. public static void main(String[] args) {
  77. // TODO Auto-generated method stub
  78. Scanner reader = new Scanner(System.in);
  79. n = reader.nextBigInteger();
  80. m = reader.nextBigInteger();
  81. k = reader.nextInt();
  82. BigInteger kbig=new BigInteger(String.valueOf(k));
  83. dp = new long[k + 1][k + 1];
  84. dp[0][0]=1;
  85. long mon=n.mod(mobig).longValue();
  86. for (int i = 0; i <= k - 1; i++)
  87. for (int j = 0; j <= i; j++) {
  88. dp[i + 1][j] = (dp[i+1][j]+(long)j*dp[i][j])%monum;
  89. dp[i + 1][j + 1] =(dp[i+1][j+1]+(long)(mon-j+monum)*dp[i][j])%monum;
  90. }
  91. long mulnum =cal(n.subtract(kbig));
  92. for (int i = k; i >= 0; i--) {
  93. ansnum1 =(ansnum1+dp[k][i]*mulnum)%monum;
  94. mulnum = (mulnum*2)%monum;
  95. }
  96. init();
  97. ans=ansnum1*lucas(n, m)%monum;
  98. System.out.println(ans);
  99. }
  100. }

java实现第四届蓝桥杯公式求值的更多相关文章

  1. Java实现第十届蓝桥杯数列求值

    试题 C: 数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数 ...

  2. java实现第四届蓝桥杯剪格子

    剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...

  3. java实现第四届蓝桥杯逆波兰表达式

    逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表 ...

  4. java实现第四届蓝桥杯黄金连分数

    黄金连分数 题目描述 黄金分割数0.61803- 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜, ...

  5. java实现第四届蓝桥杯危险系数

    危险系数 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...

  6. java实现第四届蓝桥杯阶乘位数

    阶乘位数 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格 ...

  7. java实现第四届蓝桥杯大臣的旅费

    大臣的旅费 题目描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大 ...

  8. java实现第四届蓝桥杯梅森素数

    梅森素数 题目描述 如果一个数字的所有真因子之和等于自身,则称它为"完全数"或"完美数" 例如:6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 ...

  9. java实现第四届蓝桥杯买不到的数目

    买不到的数目 题目描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 ...

随机推荐

  1. Mysql 常用函数(8)- concat 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html concat 的作用 连接多个字符串 concat ...

  2. SQLServer用with temptb AS临时表查询或者更新字段,将某个字段赋值成某个字段的值

    with temptb AS(SELECT sl.CompanyID,info.BID FROM dbo.TableXXXXX   slLEFT JOIN dbo.Tableinfo  infoON ...

  3. spring mvc --自定义converse

    在MVC中我们可以很轻松的根据项目需求进行必要的信息转换,如设置默认的日期格式,自定义String类型的格式等等... 配置中我们需要自定义converseService: <bean id=& ...

  4. jconsole+idea监控+(jvisualvm 本地内存分析)

    1.idea启动配置 添加以下内容 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.mana ...

  5. css概述三

    五.盒子模型 4.box-sizing 定义盒子模型的计算方式 box-sizing:content-box; 默认值,我们定义的width/height是内容区域 元素占地宽度=左外边距+左边框+左 ...

  6. React的第二种使用方法----脚手架方式

    一.React的第二种使用方法-----脚手架 1.前提:Node.js >8.10 2.下载全局脚手架工具 npm  i  -g  create-react-app 3.运行全局脚手架工具,创 ...

  7. linux常用命令---系统辅助命令

    系统辅助命令

  8. iOS [AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selector sent to

    AFN更新到4.0.1后,崩溃[AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selecto ...

  9. 容器技术之Docker镜像

    前文我们聊了下docker的基础使用方法,大概介绍了下docker的架构,管理镜像.运行容器.管理容器的一些相关命令说明:回顾请参考https://www.cnblogs.com/qiuhom-187 ...

  10. ShoneSharp语言(S#)的设计和使用介绍系列(10)— 富家子弟“语句“不炫富

    ShoneSharp语言(S#)的设计和使用介绍 系列(10)— 富家子弟“语句“不炫富 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Sho ...