zoukankan      html  css  js  c++  java
  • BZOJ-4403: 序列统计 (Lucas+排列组合)

    4403: 序列统计

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 1021  Solved: 477
    [Submit][Status][Discuss]

    Description

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

    Input

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

    Output

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

    Sample Input

    2
    1 4 5
    2 4 5

    Sample Output

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

    HINT

     

    Source

    By yts1999

    http://blog.csdn.net/qq_34025203/article/details/50920189

    线性求逆元证明:其中ak+b=mod  --->  k=mod/a b=mod%a 所以1/a=-(p/a)*inv[p%a]

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const int mod=1e6+3;
     5 LL fac[mod],inv[mod];
     6 void init(){
     7     int i,j;
     8     fac[0]=inv[1]=inv[0]=1;
     9     for (i=1;i<mod;i++) fac[i]=fac[i-1]*i%mod;
    10     for (i=2;i<mod;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    11     for (i=1;i<mod;i++) inv[i]=inv[i]*inv[i-1]%mod;
    12 }
    13 inline long long  Lucas(int n,int m){
    14     if (n<m) return 0;
    15     if (n<mod && m<mod) return fac[n]*inv[m]%mod*inv[n-m]%mod;
    16     return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod;
    17 }
    18 int main(){
    19     freopen ("count.in","r",stdin);freopen ("count.out","w",stdout);
    20     int i,j,t,n,L,R;
    21     init();
    22     scanf("%d",&t);
    23     while (t--){
    24         scanf("%d%d%d",&n,&L,&R);
    25         int len=R-L+1;
    26         printf("%d
    ",(Lucas(n+len,len)+mod-1)%mod);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    mysql 内联接、左联接、右联接、完全联接、交叉联接 区别
    JS 时间字符串与时间戳之间的转换
    MySQL性能优化的最佳20条经验
    ++i 与 i++ 的区别
    === 与 == 区别
    SC命令创建和删除windows服务
    杂记
    linux 文件编程
    u-boot 启动过程
    简单冒泡法
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7811900.html
Copyright © 2011-2022 走看看