NC207453. 只不过是另一个高斯罢了
描述
前言:百年之前,聪明的高斯在10岁的时候就独立的发现了自然数前n项和的通项公式。
给出一个无限长的自然数序列.
定义它的求和函数为:
现在这个公式早已广为人知,但是我们的研究不能止步于此!
学习完高斯求和公式的塔子哥想出了一个看似更难的函数?
定义广义求和函数为:
塔子哥从来只会抛出问题,而无法自己解决问题,所以他想求助于天才的你。
现在给出h,n,塔子哥想让你求解.结果可能很大,请将答案对10007取模
输入描述
一个测试文件中有多组测试数据,请处理到文件尾。对于每组测试数据,第一行两个整数:h , n. ()
输出描述
对于每组测试数据,输出一个整数代表
的结果。
示例1
输入:
1 2 1 3 10 1
输出:
3 6 1
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 508K, 提交时间: 2020-06-14 16:20:46
#include<bits/stdc++.h> typedef long long ll; typedef long double ld; using namespace std; //mt19937_64 mrand(chrono::steady_clock::now().time_since_epoch().count()); #define ii for(int i=1;i<=n;++i) #define ji for(int j=1;j<=n;++j) #define jj for(int j=1;j<=m;++j) #define ij for(int i=1;i<=m;++i) #define sz(x) ((ll)x.size()) #define all(x) x.begin(),x.end() #define al(x) x+1,x+1+n #define asd cout<<"ok"<<endl; #define asdd cout<<"okok"<<endl; #define pii pair<int,int> #define vi vector<int> #define vvi vector<vector<int>> #define vl vector<ll> #define vii vector<pair<int,int>> #define pr(v) for(auto i:v) cout<<i<<" ";cout<<endl #define prt(a, l, r) for(auto i=l;i<=r;++i) cout<<a[i]<<" ";cout<<endl; #define pc(x) __builtin_popcount(x) #define pb emplace_back const int mod = 10007; const int maxn = 10007; ll f[maxn],rf[maxn]; ll fpow(ll a,ll b) { ll ret = 1; while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;} return ret; } void init() { f[0] = 1; for(int i=1;i<maxn;++i) f[i]=f[i-1]*i%mod; rf[maxn-1] = fpow(f[maxn-1],mod-2); for(int i=maxn-2;i>=0;--i) rf[i]=rf[i+1]*(i+1)%mod; } ll comb(ll n,ll k){if(n<k||k<0)return 0;return f[n]*rf[k]%mod*rf[n-k]%mod;} ll c(ll n,ll m) { if(n < m) return 0; if(n < mod) return comb(n, m); return c(n/mod, m/mod) * comb(n%mod, m%mod) % mod; } int main() { init(); ll h,n; while(cin>>h>>n) cout<<c(h+n,h+1)<<endl; }
C++14(g++5.4) 解法, 执行用时: 37ms, 内存消耗: 616K, 提交时间: 2020-06-14 21:11:33
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=10007; ll pow(ll a, ll b, ll m) { ll ans = 1; a %= m; while(b) { if(b & 1)ans = (ans % m) * (a % m) % m; b /= 2; a = (a % m) * (a % m) % m; } ans %= m; return ans; } ll inv(ll x, ll p)//x关于p的逆元,p为素数 { return pow(x, p - 2, p); } ll C(ll n, ll m, ll p)//组合数C(n, m) % p { if(m > n)return 0; ll up = 1, down = 1;//分子分母; for(int i = n - m + 1; i <= n; i++)up = up * i % p; for(int i = 1; i <= m; i++)down = down * i % p; return up * inv(down, p) % p; } ll Lucas(ll n, ll m, ll p) { if(m == 0)return 1; return C(n % p, m % p, p) * Lucas(n / p, m / p, p) % p; } int main() { ll h,n; while(~scanf("%lld%lld",&h,&n)) { ll ans=Lucas(n+h,h+1,mod); printf("%lld\n",ans); } }