51nod 1228 (伯努利数 + 组合数学)

题目:

求这个 i=1nik
题目给你 n , k。

分析:

伯努利数于幂数和的关系:
这里写图片描述
伯努利数:
这里写图片描述
这里写图片描述
这么多性质可以直接写了

Code:

import java.util.Scanner;

public class Main {
    public static Scanner cin = new Scanner(System.in);
    public static int maxn = 2000 + 131;
    public static long MOD = (long)(1e9 + 7);
    public static long[] Inv = new long[maxn];
    public static long[] B = new long[maxn];
    public static long[] Mjie = new long[maxn];
    public static long[] InvM = new long[maxn];

    public static void INITC() {
        //逆元
        Inv[1] = 1;
        for(int i = 2; i < maxn; ++i) {
            Inv[i] = (MOD - MOD/i) * Inv[(int) (MOD % i)] % MOD;
        }
        // M!
        Mjie[0] = Mjie[1] = 1;
        for(int i = 1; i < maxn; ++i) {
            Mjie[i] = Mjie[i-1] * i % MOD;
        }
        //阶乘逆元
        InvM[1] = InvM[0] = 1;
        for(int i = 2; i < maxn; ++i) {
            InvM[i] = InvM[i-1] * Inv[i] % MOD;
        }
    }
    //组合数
    public static long CC(int m, int n) {
        if(n == 0) return 1L;
        return Mjie[m] * InvM[n] % MOD * InvM[m-n] % MOD;
    }
    //伯努利数
    public static void INIT() {
        B[0] = 1;
        for(int i = 1; i < maxn-1; ++i) {
            B[i] = 0;
            for(int j = 0; j < i; ++j) {
                B[i] += (CC(i+1,j) * B[j]) % MOD;
                B[i] %= MOD;
            }
            B[i] = B[i] * Inv[i+1] * -1 % MOD;
            B[i] = (B[i] + MOD) % MOD;
        }
    }

    public static long GetAns(long N, long K) {
        long Pow = 1;
        long ans = 0;
        for(int i = 1; i <= K+1; ++i) {
            Pow = Pow * (N+1) % MOD;
            ans = ans + (CC((int)(K+1),i) * B[(int)(K+1-i)]) % MOD * Pow % MOD;
            ans %= MOD;
        }
        ans = ans * Inv[(int)(K+1)] % MOD;
        return ans;
    }

    public static void main(String[] arg) {
        INITC();
        INIT();
        int T;
        long N, K;
        T = cin.nextInt();
        for(int t = 0; t < T; ++t) {
            N = cin.nextLong();
            K = cin.nextLong();
            System.out.println(GetAns(N % MOD,K));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值