java实现第四届蓝桥杯公式求值
公式求值
输入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实现第四届蓝桥杯公式求值的更多相关文章
- Java实现第十届蓝桥杯数列求值
试题 C: 数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数 ...
- java实现第四届蓝桥杯剪格子
剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...
- java实现第四届蓝桥杯逆波兰表达式
逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表 ...
- java实现第四届蓝桥杯黄金连分数
黄金连分数 题目描述 黄金分割数0.61803- 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜, ...
- java实现第四届蓝桥杯危险系数
危险系数 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...
- java实现第四届蓝桥杯阶乘位数
阶乘位数 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格 ...
- java实现第四届蓝桥杯大臣的旅费
大臣的旅费 题目描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大 ...
- java实现第四届蓝桥杯梅森素数
梅森素数 题目描述 如果一个数字的所有真因子之和等于自身,则称它为"完全数"或"完美数" 例如:6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 ...
- java实现第四届蓝桥杯买不到的数目
买不到的数目 题目描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 ...
随机推荐
- 一文带你学会国产加密算法SM4的java实现方案
前言 今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,可以直接应用到项目中进行加密解密. 画重点!是SM4哦,不 ...
- java中字符串截取
1.使用StringUtils,需要导包 String strs = "abcdef1003535197"; System.out.println("=====2==== ...
- HTML中id与name的通俗区别
转自:https://blog.csdn.net/qq_35038153/article/details/70215356 https://zhidao.baidu.com/question/7582 ...
- Python之字符串中是否包含子串的几种方法
#第一种方式 :in a='abcdaac' b='a' c='db' print(b in a) print(c in a) 预览结果 #第二种方式:count()方法 a='abcdefgab' ...
- 《机器学习_08_代价敏感学习_添加sample_weight支持》
简介 这一节主要是为模型打补丁,在这之前笔者已经介绍并实现了几种典型的机器学习模型,比如线性回归.logistic回归.最大熵.感知机.svm等,但目前它们都有一个共性,那就是构造的损失函数对每个样本 ...
- vue触发事件的五个关键字
v-on vue中提供了v-on事件绑定 v-on:click='函数'; v-on可以使用@代替 vue 五个触发事件关键字 .stop 用于阻止冒泡 例如 div1 ...
- VSCode开发Vue-代码格式化最完美设置
Vue在VsCode上面的开发,代码格式话是个老大难问题了. 有很多文章介绍Prettier四个配置方法,以及如何启用.但是结果就是:一个一个配完,还是看着难受 现在尝试出一种最完美格式化方式,分享出 ...
- SpringBoot—自定义线程池及并发定时任务模板
介绍 在项目开发中,经常遇到定时任务,今天通过自定义多线程池总结一下SpringBoot默认实现的定时任务机制. 定时任务模板 pom依赖 <dependencies> <dep ...
- Python 每日一练(7)
引言 今天的练习比较轻松,原本是有两题的,但是第一题那个大致看了一下,其实和之前的6个练习差不多,就是把xls中的文件数据读取出来后,进行一下处理,对于那题而言就是一个求和操作,所以就没练了,所以今天 ...
- JAVA自学笔记(1)
JAVA入门级知识储备(一) 1.Scanner的欢乐接收 import java.util.Scanner; public class first { public static void main ...