藍橋杯-組合公式求值(java)
演算法提高 組合公式求值 時間限制:1.0s 記憶體限制:256.0MB 問題描述 給定n, m,求: 輸入格式 輸入一行,包含兩個整數n, m。 輸出格式 輸出一行,包含求得的值,由於答案可能非常大,請輸出此公式除以987654321的餘數。 樣例輸入 3 1 樣例輸出 162 資料規模和約定 1<=m<=n<=10^7。
package com.sihai.improve;
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();
}
}
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.0s 記憶體限制:256.0MB 問題描述 給定n, m,求: 輸入格式
藍橋杯——組合公式求值
問題描述 給定n, m,求:輸入格式 輸入一行,包含兩個整數n, m。輸出格式 輸出一行,包含求得的值,由於答案可能非常大,請輸出此公式除以987654321的餘數。樣例輸入3 1樣例輸出162資料規模和約定 1<=m<=n<=10^7。我的思路是將
2015藍橋杯決賽 01 機器人數目(java)
標題:機器人數目少年宮新近郵購了小機器人配件,共有3類,其中,A類含有:8個輪子,1個感測器B類含有: 6個輪子,3個感測器C類含有:4個輪子,4個感測器他們一共訂購了100套機器人,收到了輪子600個,感測器280個。根據這些資訊請你計算:B型別機器人訂購了多少個?請直接提
演算法-藍橋杯-演算法提高 矩陣翻轉 (JAVA)
1 引言 這是藍橋杯演算法提高部分的第一篇文章。通過做演算法提高部分的習題,我深刻地認識到自己在演算法方面的不足,在資料結構方面還有待提高。客觀上來講,自己並沒有一直在做演算法方面的訓練,所以許多題目沒有思路或者說有思路不知道如何實現。另一方面,就是自己在演算法方面投入
藍橋杯-演算法訓練-sign函式(java)
問題描述 給定實數x,輸出sign(x)的值。 sign(x)是符號函式,如果x>0,則返回1;如果x=0,則返回0;如果x<0,則返回-1。 輸入格式 一行一個實數x。 輸出
2017第八屆藍橋杯 01 外星日曆(java)
標題:外星日曆某星系深處發現了文明遺蹟。他們的計數也是用十進位制。他們的文明也有日曆。日曆只有天數,沒有年、月的概念。有趣的是,他們也使用了類似“星期”的概念,只不過他們的一個星期包含了9天,為了方便,這裡分別記為: A,B,C....H,I從一些資料上看到,他們的23日是星
演算法-藍橋杯-演算法訓練 表示式計算 (JAVA)
1 引言什麼題。。。2 題目問題描述 輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含一個表示式。輸出格式 輸出這個表示式的值。樣例輸入1-2+3*(4-5)樣例輸出-4資料規模和約定 表示式長度不超過100,表示式運算
藍橋杯 歷屆試題 翻硬幣(Java)
小明正在玩一個“翻硬幣”的遊戲。 桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。 比如,可能情形是:**oo***oooo 如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo 現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻
演算法-藍橋杯-入門訓練 Fibonacci數列 (JAVA)
1 引言 斐波那契數列一直以來都是一個經典的問題,可惜的是以前“只聞其聲不見其人”,沒有好好地研究這個問題,這次恰好在藍橋杯的入門訓練中遇到,實乃萬幸。2 題目問題描述Fibonacci數列的遞推
藍橋杯 PREV-20 公式求值(母函式,推導,dp)
解題方案: 因為n的範圍巨大,所以直接用高精度暴力肯定會t。所以還是看看q老師在貼吧的傳道授業解惑吧。 1.首先有母函式, 2.兩邊對x求導後再同乘x,得 3.再重複上述操作,得 這樣就可以發
奇怪的表達式求值 (java實現)
name 所在 cas 生活 div img num rar java 題目參考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 問題描述; 題目描述: 常規的表達式求值,我們都會根據計算的優先級來計算。
藍橋杯-演算法訓練-矩陣相乘(java版)
問題描述 輸入兩個矩陣,分別是m*s,s*n大小。輸出兩個矩陣相乘的結果。 輸入格式 第一行,空格隔開的三個正整數m,s,n(均不超過200)。 接下來m行,每行s個空格隔開的整數,表示矩陣A(i,j)。 接下來s行,每行n個空格隔開的整數,表示矩陣B(i,j)。 輸出格式 m行,每行n個
藍橋杯-----------------基礎訓練 數列排序(Java程式碼)
一、數列排序 問題描述:給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200。 二、解題思想: 對於排序,無論是資料結構還是自己手寫都有很多種方法進行解決。但是,
藍橋杯 演算法提高 概率計算(Java解題)
問題描述 生成n個∈[a,b]的隨機整數,輸出它們的和為x的概率。輸入格式 一行輸入四個整數依次為n,a,b,x,用空格分隔。輸出格式 輸出一行包含一個小數位和為x的概率,小數點後保留四位小數樣例輸入2 1 3 4樣例輸出0.3333資料規模和約定 對於50%的資料,
棧的應用--四則運算表示式求值(java語言)
棧的應用–四則運算表示式求值(java語言) 前言 在複習資料結構的過程中,採用單鏈表實現了棧Stack,具體功能有如下幾個功能:判斷其是否為空棧、輸出棧的長度、入棧、出棧並且實現Iterable藉口,可以採用Iterator遍歷棧。在測試了棧之後,覺得應該
藍橋杯 演算法提高 佇列操作(Java解題)
問題描述 佇列操作題。根據輸入的操作命令,操作佇列(1)入隊、(2)出隊並輸出、(3)計算隊中元素個數並輸出。 輸入格式 第一行一個數字N。 下面N行,每行第一個數字為操作命令(1)入隊、(2)出隊並輸出、(3)計算隊中元素個數並輸出。 輸出格式
表示式求值(堆疊)
思路: (1)建立兩個字元型的堆疊和一個浮點數的堆疊 (2)先輸入表示式,將表示式轉換為字尾表示式 (3)求出字尾表示式的結果 #include<iostream> #include<cstring> #include<cstdio> using namesp
資料結構——表示式求值(程式碼)
表示式求值 C++ 環境codeblocks17 通過 /* 表示式求值,可用運算子 +-/*(){}[] @CGQ 2018/10/30 */ #include<stdio.h> #include<stdlib.h> #include<ctype.h>
獲取大檔案MD5值(JAVA)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
藍橋杯——連號區間數(暴力)
題目:http://lx.lanqiao.cn/problem.page?gpid=T30 分析:注意到輸入格式裡介紹“第二行是N個不同的數字Pi(1 <= Pi <= N)”,這裡就可以知道第二行的數由1,2,3······N-1,N組成,雖然此題不用到這個,但以後也要有這個覺悟,閱讀題目要仔