• 【BZOJ4402】Claris的剑(组合计数)


    题意:

    给定数列的定义:

    1.每个元素都是正整数

    2.每个元素不能超过M

    3.相邻两个元素的差的绝对值必须是1

    4.第一个元素的值必须是1

    求有多少个长度不超过N的合法的本质不同的序列

    两个序列本质不同,当且仅当存在至少一个数值,在两个序列中出现次数不一样

    比如{1,2,3}和{1,3,2}是本质相同的

    {1,2,3}和{1,2,1}则是本质不同的

    答案对1e9+7取模

    N,M<=2e6

    思路:From https://blog.csdn.net/ws_yzy/article/details/50753724

     1 #include<cstdio>
     2 typedef long long ll;
     3 using namespace std;
     4 #define MOD 1000000007
     5 #define N 2100000
     6 ll fac[N],inv[N]; 
     7 
     8 
     9 ll c(int x,int y)
    10 {
    11     return fac[x]*inv[y]%MOD*inv[x-y]%MOD;
    12 }
    13 
    14 ll calc(int x,int y)
    15 {
    16     if(x<0) return 0;
    17     if(x==0||x==1) return 1;
    18     return c(x/2+y,y);
    19 }
    20 
    21 int main()
    22 {
    23     int n,m;
    24     scanf("%d%d",&n,&m);
    25     fac[0]=1;
    26     for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%MOD;
    27     inv[0]=inv[1]=1;
    28     for(int i=2;i<=n;i++) inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
    29     for(int i=1;i<=n;i++) inv[i]=inv[i]*inv[i-1]%MOD;
    30     ll ans=0;
    31     if(n&&m) ans++;
    32     for(int i=2;i<=m;i++)
    33     {
    34         ans=(ans+calc(n-i,i-1))%MOD;
    35         ans=(ans+calc(n-i-1,i-1))%MOD;
    36     }
    37     printf("%lld
    ",ans);
    38     return 0;
    39 }
    40      
    41  
  • 相关阅读:
    B/S---控件属性
    Windows Form -----内容(11)
    C#--Web控件简介
    C#控件基本1
    C#增删改小总结
    C#播放器控件的常用方法介绍
    C#封装---小练
    链接SQL、事务---小总结
    事务-----2
    事务----1
  • 原文地址:https://www.cnblogs.com/myx12345/p/9917438.html
Copyright © 2020-2023  润新知