1. 程式人生 > >藍橋杯-組合公式求值(java)

藍橋杯-組合公式求值(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>

獲取大檔案MD5JAVA

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

藍橋——連號區間數暴力

題目:http://lx.lanqiao.cn/problem.page?gpid=T30 分析:注意到輸入格式裡介紹“第二行是N個不同的數字Pi(1 <= Pi <= N)”,這裡就可以知道第二行的數由1,2,3······N-1,N組成,雖然此題不用到這個,但以後也要有這個覺悟,閱讀題目要仔