zoukankan      html  css  js  c++  java
  • BZOJ2982: combination Lucas

    Description

    LMZn个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值。(1<=m<=n<=200,000,000)

    Input

      第一行一个整数t,表示有t组数据。(t<=200)
      接下来t行每行两个整数n, m,如题意。

    Output

    T行,每行一个数,为C(n, m) mod 10007的答案。

    Sample Input

    4
    5 1
    5 2
    7 3
    4 2

    Sample Output

    5
    10
    35
    6

    Solution

    Lucas板子

    #include <bits/stdc++.h>
    
    using namespace std ;
    
    const int mod = 10007 ;
    
    int t , n , m ;
    int fac[ mod + 10 ] , ifac[ mod + 10 ] ; 
    
    int power( int a , int b ) {
        int ans = 1 , base = a ;
        while( b ) {
            if( b & 1 ) ans = ans * base % mod ;
            base = base * base % mod ;
            b >>= 1 ;
        }
        return ans ;
    }
    
    int lucas( int a , int b ) {
        if( a > b ) return 0 ;
        if( b <= mod ) return fac[ b ] % mod * ifac[ a ] % mod * ifac[ b - a ] % mod ;
        return lucas( a % mod , b % mod ) % mod * lucas( a / mod , b / mod ) % mod ;
    }
    
    int main() {
        scanf( "%d" , &t ) ;
        fac[ 0 ] = 1 ; 
        for( int i = 1 ; i <= mod ; i ++ ) fac[ i ] = fac[ i - 1 ] * i % mod ;
        for( int i = 0 ; i <= mod ; i ++ ) ifac[ i ] = power( fac[ i ] , mod - 2 ) % mod ;
        while( t -- ) {
            scanf( "%d%d" , &n , &m ) ;
            printf( "%d
    " , lucas( m , n ) ) ;
        }
        return 0 ;
    } 
  • 相关阅读:
    Maven+SSM框架搭建【spring+springmvc+mybatis】
    [福大软工] W班 总成绩排行榜
    项目Beta冲刺团队随笔集
    45度炸队Alpha冲刺博客集
    SDN期末验收
    小黄衫——共同的荣誉
    软件工程实践总结作业
    SDN第五次上机作业
    SDN第四次作业
    总结随笔
  • 原文地址:https://www.cnblogs.com/henry-1202/p/BZOJ2982.html
Copyright © 2011-2022 走看看