列表

详情


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

上一题