51nod 1228 序列求和 【伯努利数与自然数幂和】
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1228
这道题需要用到伯努利数,我也是去现学的,因为是数学,有些东西也不是很懂。
大佬博客:https://blog.****.net/ACdreamers/article/details/38929067
///#include<bits/stdc++.h>
///#include<unordered_map>
///#include<unordered_set>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<set>
#include<stack>
#include<map>
#include<new>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const double E=2.718281828459;
const long long mod=1e9+7;
ll n,k;
ll c[2005][2005]; ///组合数
ll b[2005]; ///伯努利数
ll temp[2005]; ///(n+1)的i次幂
ll ny[2005]; /// ny[i]表示(i+1)的逆元
ll power(ll a,ll b,ll c)
{
ll ans=1;
while(b>0)
{
if(b&1)
ans=ans*a%c;
a=a*a%c;
b=b>>1;
}
return ans;
}
void init()
{
for(ll i=0;i<=2000;i++) ///预处理组合数
{
c[i][0]=c[i][i]=1;
if(i==0) continue;
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j]%mod+c[i-1][j-1]%mod)%mod;
}
ny[0]=1; ///预处理逆元
for(int i=1;i<=2003;i++)
ny[i]=power(i+1,mod-2,mod);
b[0]=1; ///预处理伯努利数
for(ll i=1;i<=2003;i++)
{
ll s=0;
for(ll j=0;j<i;j++)
s=(s+c[i+1][j]*b[j])%mod;
s=(s*(-ny[i])%mod+mod)%mod;
b[i]=s;
}
return ;
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
scanf("%lld %lld",&n,&k);
n=n%mod; ///这一步为什么我也不知道。
temp[0]=1;
for(ll i=1;i<=2004;i++)
temp[i]=temp[i-1]*(n+1)%mod; ///预处理(n+1)^i;
ll ans=0;
for(ll i=1;i<=k+1;i++)
ans=(ans+c[k+1][i]*b[k+1-i]%mod*temp[i]%mod)%mod;
ans=ans*ny[k]%mod;
printf("%lld\n",ans);
}
return 0;
}