C11CAL - Tính toán
Tác giả: hieult
Ngôn ngữ: C++
#include<cstdio>
#include<cmath>
#include<math.h>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
#define ep 0.00001
#define maxn 100111
#define oo 1111111111
#define modunlo 35000
#define mod 1000000007
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
//#define g 9.81
double const PI=4*atan(1.0);
//#include<conio.h>
using namespace std;
typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;
long long mu(long long x,long long n){
if(n==1) return x;
long long t = mu(x,n/2);
if(n&1) return (((t*t)%mod)*x)%mod;
return (t*t)%mod;
};
long long f[35005][51],C[51][51],tong[35005][51],n,k;
int main(){
// freopen("C11CAL.in","r",stdin);
// freopen("C11CAL.out","w",stdout);
memset(C,0,sizeof(C));
memset(tong,0,sizeof(tong));
for(int i = 1;i<=35000;i++){
long long tinh = 1;
for(int j = 0;j<=50;j++){
f[i][j] = tinh;
tong[i][j] = (tong[i-1][j]+tinh)%mod;
tinh = (tinh*i)%mod;
}
}
for(int i = 0;i<=50;i++) C[0][i] = 1;
for(int i = 1;i<=50;i++) for(int j = 1;j<=i;j++) C[j][i] = (C[j][i-1]+C[j-1][i-1])%mod;
while(cin>>n>>k){
long long u = n/modunlo - 1;
long long v = n%modunlo;
long long kq = 0;
kq = (tong[modunlo][k]*(u+1))%mod;
if(u>0)
for(int i = k;i>=1;i--){
kq = (kq+(((((tong[u][i]*C[i][k])%mod)*f[modunlo][i])%mod)*tong[modunlo][k-i])%mod)%mod;
}
kq = (kq+tong[v][k])%mod;
for(int i = k;i>=1;i--){
kq = (kq+(((((f[u+1][i]*C[i][k])%mod)*f[modunlo][i])%mod)*tong[v][k-i])%mod)%mod;
}
printf("%lld\n",kq);
}
}