TopCoder SRM 467 Medium SuperSum

問題

supersum(k,n)を、
supersum(0,n)=n
supersum(k,n)=Σ[i=1 to n]supersum(k-1,i)
により定義する。

与えられた整数n,kに対してsupersum(n,k)をmod 10^9+7で求めよ。

制約条件

n≦10^9
k≦50

方針

小さい数で実験してみると、
supersum(n,k)はC(n+k,k+1)になっていることがわかる。


C(n+k,k+1)をmod 10^9+7で求めればよい。
10^9+7は素数であり、かつk+1が小さいので逆元から簡単にC(n+k,k+1)が求まる。

ソースコード

const int mod=(int)1e9+7;
ll extgcd(ll a,ll b,ll &x,ll &y){
	ll d=1;
	if(b){
		d=extgcd(b,a%b,y,x);
		y-=a/b*x;
	}
	else x=1,y=0;
	return d;
}
int inv(int n){
	ll x,y;
	extgcd(n,mod,x,y);
	return (x%mod+mod)%mod;
}
ll C(int n,int k){
	ll ret=1;
	rep(i,k)ret=ret*(n-i)%mod*inv(i+1)%mod;
	return ret;
}
class SuperSum {
	public:
	int calculate(int k, int n) 
	{
		return C(n+k,k+1);
	}
};