【蓝桥杯】历届试题 公式求值

  历届试题 公式求值  

时间限制:1.0s   内存限制:256.0MB

问题描述

  输入n, m, k,输出下面公式的值。

  其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数。组合数的计算公式如下。

输入格式

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

输出格式

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

样例输入

3
1
3

样例输出

162

样例输入

20
10
10

样例输出

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的数据;

Java源代码:

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3
 4 public class Main {
 5     public static BigInteger lucas(BigInteger n, BigInteger m, BigInteger p) {
 6         if (m.equals(BigInteger.ZERO))
 7             return BigInteger.ONE;
 8         return BigInteger
 9                 .valueOf(f(n.mod(p).longValue(), m.mod(p).longValue()))
10                 .multiply(lucas(n.divide(p), m.divide(p), p)).mod(p);
11     }
12
13     public static long f(long n, long m) {
14         if (m > n)
15             return 1;
16         if (n == m || m == 0)
17             return 1;
18         if (m > n - m)
19             m = n - m;
20         long tmpi = 1, tmpn = 1, s1 = 1, s2 = 1, ans = 1;
21         for (int i = 1; i <= m; i++) {
22             tmpi = i;
23             tmpn = n - i + 1;
24             s1 = s1 * tmpi % 999101;
25             s2 = s2 * tmpn % 999101;
26         }
27         ans = s2 * pow1(s1, 999099) % 999101;
28         return ans % 999101;
29     }
30
31     public static long pow1(long x, long n) {
32         if (x == 1)
33             return 1;
34         if (n == 0)
35             return 1;
36         else {
37             while ((n & 1) == 0) {
38                 n >>= 1;
39                 x = (x * x) % 999101;
40             }
41         }
42         long result = x % 999101;
43         n >>= 1;
44         while (n != 0) {
45             x = (x * x) % 999101;
46             ;
47             if ((n & 1) != 0)
48                 result = result * x % 999101;
49             n >>= 1;
50         }
51         return result;
52     }
53
54     public static void main(String[] args) {
55         Scanner sc = new Scanner(System.in);
56         BigInteger n = new BigInteger(sc.nextLine());
57         BigInteger m = new BigInteger(sc.nextLine());
58         int k = Integer.parseInt(sc.nextLine());
59         BigInteger md = new BigInteger("999101");
60         long Cnm = lucas(n, m, md).longValue() % 999101;
61         long sum = 0;
62         if (Cnm != 0) {
63             int[][] a = new int[k][k];
64             int h = 1;
65             for (int i = 0; i < k; i++) {
66                 for (int j = 0; j < k; j++) {
67                     if (j >= h)
68                         a[i][j] = 0;
69                     else {
70                         if (j == 0 || j == h - 1)
71                             a[i][j] = 1;
72                         else {
73                             a[i][j] = (a[i - 1][j - 1] * (h - j) + a[i - 1][j]) % 999101;
74                         }
75                     }
76                 }
77                 h++;
78             }
79             long m1 = 1, n1 = 1;
80             long x = n.subtract(new BigInteger(k + ""))
81                     .mod(md.subtract(BigInteger.ONE)).longValue();
82             long n3 = pow1(2, x);
83             for (int i = k - 1; i >= 0; i--) {
84                 n1 = n3 * pow1(2, i) % 999101;
85                 m1 = m1
86                         * (n.subtract(new BigInteger((k - 1 - i) + "")).mod(md)
87                                 .longValue()) % 999101;
88                 sum = (sum + m1 * a[k - 1][i] * n1) % 999101;
89             }
90             sum = sum * Cnm % 999101;
91         }
92         System.out.println(sum);
93     }
94
95 }
评测点序号 评测结果 得分 CPU使用 内存使用 下载评测数据
1 正确 10.00 187ms 23.37MB 输入 输出
2 正确 10.00 171ms 23.19MB 输入 输出
3 正确 10.00 156ms 23.46MB 输入 输出
4 正确 10.00 202ms 23.36MB 输入 输出
5 正确 10.00 202ms 23.15MB 输入 输出
6 正确 10.00 187ms 23.86MB 输入 输出
7 正确 10.00 202ms 23.94MB 输入 输出
8 正确 10.00 327ms 25.40MB 输入 输出
9 正确 10.00 483ms 30.19MB 输入 输出
10 正确 10.00 436ms 31.25MB 输入 输出
时间: 2024-10-07 05:31:31

【蓝桥杯】历届试题 公式求值的相关文章

蓝桥杯-历届试题-公式求值

历届试题 公式求值 时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于10%的数

蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿). 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明. 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝. 输入格式 输入一行3个整数,用空格分开:n

蓝桥杯 历届试题 题目总结

后天就是蓝桥杯省赛了,今天总结一下这段时间做的蓝桥杯历届试题,还是一个一个题目的来吧!!!!!! 1,历届试题 矩阵翻硬币 这个题目说真的,我不会,在网上看了某神牛的题解答案为 ans=sqrt(n)*sqrt(m),具体怎么证明的我也不知道 2,历届试题 兰顿蚂蚁 这个题目怎么说呢,应该是送分题,直接模拟就可以了,这里就不说了. 3, 历届试题 分糖果 这个题目好像之前在哪里做过,也是一道模拟题,弄两个数组搞一下就可以了 下面是代码 #include<bits/stdc++.h> using

蓝桥杯-历届试题之大臣的旅费

历届试题 大臣的旅费 时间限制:1.0s   内存限制:256.0MB 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达.同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的. J是T国重要大臣,他巡查于各大城市之间,体察民情.所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情.他有一个钱袋,用于

蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解

历届试题 约数倍数选卡片 时间限制:1.0s   内存限制:256.0MB 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字"6",则接下来华生可以拿的数字包括: 1,2,3, 6,12,18,24 .... 当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方. 请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎

蓝桥杯 历届试题 斐波那契

困扰我N天的一题,今天终于解决了.话不多说,直接上题. 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) .... (x>2) 对于给定的整数 n 和 m,我们希望求出: f(1) + f(2) + ... + f(n) 的值.但这个值可能非常大,所以我们把它对 f(m) 取模. 公式如下 但这个数字依然很大,所以需要再对 p 求模. 输入格式 输入为一行用空格分开的整数 n m p (0 < n, m

蓝桥杯 历届试题 PREV-34 矩阵翻硬币

历届试题 矩阵翻硬币 时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转. 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始. 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹--所有硬币均为正面朝上. 小明想知道最开始有多少枚硬币是反面朝上的.于是,他向他的好朋友小M寻求帮助.

蓝桥杯 历届试题 买不到的数目

历届试题 买不到的数目 时间限制:1.0s   内存限制:256.0MB 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖. 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17.大于17的任何数字都可以用4和7组合出来. 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字. 输入格式 两个正整数,表示每种包装中糖的颗数(都不

蓝桥杯 历届试题 连号区间数

历届试题 连号区间数 时间限制:1.0s   内存限制:256.0MB 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的"连续"数列,则称这个区间连号区间. 当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助. 输入格式 第一行是一个正整数N (1 &