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);	      
	 }
	 
}

Download