zoukankan      html  css  js  c++  java
  • 序列统计(bzoj 4403)

    Description

    给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。

    Input

    输入第一行包含一个整数T,表示数据组数。第2到第T+1行每行包含三个整数N、L和R,N、L和R的意义如题所述。

    Output

    输出包含T行,每行有一个数字,表示你所求出的答案对106+3取模的结果。

    Sample Input

    21 4 52 4 5

    Sample Output

    25

    HINT

    提示

    【样例说明】满足条件的2个序列为[4]和[5]。

    【数据规模和约定】对于100%的数据,1≤N,L,R≤10^9,1≤T≤100,输入数据保证L≤R。

    /*
        设m=r-l+1,枚举每个长度i,那么问题就成了有i个相同的小球放到m个相同的盒子中,允许盒子为空的方案数,
        方案为C(i+m-1,m-1),最后的答案就是ΣC(i+m-1,m-1)=C(n+m,m)-1。 
    */
    #include<iostream>
    #include<cstdio>
    #define N 1000010
    #define mod 1000003
    #define lon long long
    using namespace std;
    lon inv[N],jc1[N],jc2[N];
    void init(){
        inv[0]=inv[1]=1;for(int i=2;i<N;i++) inv[i]=((mod-mod/i)*inv[mod%i])%mod;
        jc1[0]=1;for(int i=1;i<N;i++) jc1[i]=(jc1[i-1]*i)%mod;
        jc2[0]=1;for(int i=1;i<N;i++) jc2[i]=(jc2[i-1]*inv[i])%mod;
    }
    lon C(lon n,lon m){
        if(n<m) return 0;
        return ((jc1[n]*jc2[m])%mod*jc2[n-m])%mod;
    }
    lon lucas(lon n,lon m){
        return (C(n%mod,m%mod)*C(n/mod,m/mod))%mod;
    }
    int main(){
        init();
        int T;scanf("%d",&T);
        lon n,l,r,m;
        while(T--){
            cin>>n>>l>>r;
            m=r-l+1;
            lon ans=lucas(n+m,m);
            if(ans) cout<<ans-1<<endl;
            else cout<<mod-1<<endl;
        }
        return 0;
    }
  • 相关阅读:
    移除roadhog用webpack4代替
    git pull request
    java 希尔排序 归并排序 快速排序 三路快速排序
    简洁的 async await
    react-navigation 实现简单登录 跳转路由
    d3序数比例尺理解
    echarts vue 甘特图实现
    element table 实现鼠标拖拽选中
    CSS一些总结
    Nginx location 匹配规则
  • 原文地址:https://www.cnblogs.com/harden/p/6673384.html
Copyright © 2011-2022 走看看