公式求值

输入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(这就是那个测试点的问题所在)

import java.math.BigInteger;
import java.util.Scanner;
class Number {
long x,y,dd; /**
* @param x
* @param y
* @param dd
*/
public Number(long x, long y, long dd) {
super();
this.x = x;
this.y = y;
this.dd = dd;
} /**
*
*/
public Number() {
super();
// TODO Auto-generated constructor stub
} }
public class Main {
static BigInteger n, m;
static int k;
static long monum = 999101;
static BigInteger mobig = new BigInteger("999101");
static BigInteger big2 = new BigInteger("2");
static long ansnum1,ans;
static long dp[][], bignum[], subnum[];
static long fact[];
private static Number gcd(long a,long b) {
if (b==0) return new Number(1,0,a);
Number number=gcd(b, a%b);
long x=number.y;
long y=number.x-(a/b)*number.y;
long dd=number.dd;
return new Number(x,y,dd);
}
private static long mod_inverse(long num) {
if (num==0) return 0;
Number number=gcd(num, monum);
long x=(number.x+monum)%monum;
return x;
}
private static long cal(BigInteger num) {
if (num.equals(BigInteger.ZERO)) return 1;
if (num.equals(BigInteger.ONE)) return 2;
long mnum = cal(num.divide(big2));
mnum = mnum*mnum%monum;
BigInteger mo = num.mod(big2);
if (mo.equals(BigInteger.ONE))
mnum=mnum*2%monum;
return mnum;
} private static void init() {
fact = new long[(int) (monum + 1)];
fact[0] = 1;
for (int i = 1; i <= monum; i++)
fact[i]=(fact[i-1]*(long)i)%monum;
}
private static long calc(int n,int m) {
if (n<m) return 0;
long mo=fact[m]*fact[n-m]%monum;
long divnum=mod_inverse(mo);
long res=fact[n]*divnum%monum;
return res;
}
private static long lucas(BigInteger n,BigInteger m){
if (m.equals(BigInteger.ZERO)) return 1;
int nmo=n.mod(mobig).intValue();
int mmo=m.mod(mobig).intValue();
return calc(nmo, mmo)*lucas(n.divide(mobig),m.divide(mobig))%monum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner reader = new Scanner(System.in);
n = reader.nextBigInteger();
m = reader.nextBigInteger();
k = reader.nextInt();
BigInteger kbig=new BigInteger(String.valueOf(k));
dp = new long[k + 1][k + 1];
dp[0][0]=1;
long mon=n.mod(mobig).longValue();
for (int i = 0; i <= k - 1; i++)
for (int j = 0; j <= i; j++) {
dp[i + 1][j] = (dp[i+1][j]+(long)j*dp[i][j])%monum;
dp[i + 1][j + 1] =(dp[i+1][j+1]+(long)(mon-j+monum)*dp[i][j])%monum;
}
long mulnum =cal(n.subtract(kbig));
for (int i = k; i >= 0; i--) {
ansnum1 =(ansnum1+dp[k][i]*mulnum)%monum;
mulnum = (mulnum*2)%monum;
}
init();
ans=ansnum1*lucas(n, m)%monum;
System.out.println(ans);
} }

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. VMware Tanzu已融合云原生与K8s 市场前景尚不确定

    Tanzu是什么? Tanzu 结合了Wavefront IT监控的项目和产品,VMware于2017年5月收购了该软件,并加入了Cloud Foundry PaaS实用工具.VMware在2019年 ...

  2. 学习ASP.NET Core(05)-使用Swagger与Jwt授权

    上一篇我们使用IOC容器解决了依赖问题,同时简单配置了WebApi环境,本章我们使用一下Swagger,并通过Jwt完成授权 一.Swagger的使用 1.什么是Swagger 前后端分离项目中,后端 ...

  3. ipad4密码忘记锁定了如何破解

    ipad4更新后被要求输入密码,但很长一段时间后忘记了,一直想不起来,也没有忘记密码的选项,以下是简单的破解方法. 注意:没有备份的资料是要被清空的 一.windows10系统,安装iTunes安装 ...

  4. Python单元测试框架:pytest

    (一)介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手: 2.支持参数化: 3.能够支持简单的单元测试和复杂的功能测试,还可以用来做sele ...

  5. Spring Cloud Alibaba入门实战之nacos(一)

    Spring Cloud Alibaba入门实战之nacos(一) 前情介绍 ​ Spring Cloud Alibaba 是阿里巴巴提供的新一代的微服务解决方案,相信会有越来越多采用微服务架构的公司 ...

  6. 2.3 Go内置函数

    内置函数 Go 语言拥有一些不需要进行导入操作就可以使用的内置函数.它们有时可以针对不同的类型进行操作,例如:len.cap 和 append,或必须用于系统级的操作,例如:panic.因此,它们需要 ...

  7. Hills And Valleys 杭电多校第五场

    题意:长度为n的序列,有一次翻转区间的机会,问最长不减序列 题解:如果没有翻转区间的机会,有两个做法. 一是dp[i]表示以i结尾的最长序列 dp[i]=max(dp[i],dp[j]+1)  (j& ...

  8. A + B Problem(hdu1000)

    注意,认真读题目的Input要求,看看是输入一组测试数据还是输入多组测试数据.输入多组数据,不要忘记while(). #include<iostream> using namespace ...

  9. python+selenium 自动化测试框架-学习记录

     本人小白一枚,想着把学习时的东西以博客的方式记录下来,文章中有不正确的地方请大佬多多指点!!共同学习 前期准备 安装python3.selenium.下载对应版本的webdriver:安装所需的第三 ...

  10. [Python基础]004.语法(3)

    语法(3) 方法 定义 调用 参数 返回 模块 引入模块 写模块 模块名称 dir() 方法 定义 语法 def 方法名(参数): 返回值 return 没有指定返回值的方法,默认返回空值 None ...