zoukankan      html  css  js  c++  java
  • Bzoj2655 calc

    Time Limit: 30 Sec  Memory Limit: 512 MB
    Submit: 255  Solved: 162

    Description

      一个序列a1,...,an是合法的,当且仅当:
      长度为给定的n。
      a1,...,an都是[1,A]中的整数。
      a1,...,an互不相等。
      一个序列的值定义为它里面所有数的乘积,即a1a2...an。
      求所有不同合法序列的值的和。
      两个序列不同当且仅当他们任意一位不一样。
      输出答案对一个数mod取余的结果。

    Input

      一行3个数,A,n,mod。意义为上面所说的。

    Output

      一行结果。

    Sample Input

    9 7 10007

    Sample Output

    3611

    HINT

    数据规模和约定

      0:A<=10,n<=10。

      1..3:A<=1000,n<=20.

      4..9:A<=10^9,n<=20

      10..19:A<=10^9,n<=500。

      全部:mod<=10^9,并且mod为素数,mod>A>n+1

    Source

    数学问题 伯努利数 容斥 脑洞题

    设$ f[i] $表示长度为i的合法序列,$ g[i]=sum{j=1}^{A} j^i $

    然后容斥一下:

    $ f[i]=g[i]*f[i-1] - C_{i-1}^{1}*(2-1)!*g[2]*f[i-2]+ C_{i-1}^{2}*(3-1)!*g[3]*f[i-3] - ...$

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #define LL long long
     7 using namespace std;
     8 const int mxn=511;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 int A,n,mod;
    16 int c[mxn][mxn],inv[mxn],fac[mxn];
    17 LL B[mxn],g[mxn],f[mxn];
    18 void init(){
    19     int i,j;
    20     int mxn=n+2;
    21     for(i=0;i<mxn;i++)c[i][0]=1;
    22     for(i=1;i<mxn;i++)
    23         for(j=1;j<mxn;j++)
    24             c[i][j]=((LL)c[i-1][j-1]+c[i-1][j])%mod;
    25     inv[0]=inv[1]=1;fac[0]=fac[1]=1;
    26     for(i=2;i<mxn;i++){
    27         inv[i]=((-mod/i*(LL)inv[mod%i]%mod)+mod)%mod;
    28         fac[i]=(LL)fac[i-1]*i%mod;
    29     }
    30     B[0]=1;
    31     for(i=1;i<mxn;i++){
    32         for(j=0;j<i;j++)
    33             B[i]=(B[i]-c[i+1][j]*B[j])%mod;
    34         B[i]=B[i]*inv[i+1]%mod;
    35         if(B[i]<0)B[i]+=mod;
    36     }
    37     return;
    38 }
    39 void solve(){
    40     int i,j,k;
    41     for(k=1;k<=n;k++){
    42         int tmp=A+1,bas=tmp;
    43         for(i=1;i<=k+1;i++){
    44             g[k]=g[k]+c[k+1][i]*B[k+1-i]%mod*tmp%mod;
    45             if(g[k]>=mod)g[k]-=mod;
    46             tmp=(LL)tmp*bas%mod;
    47         }
    48         g[k]=g[k]*inv[k+1]%mod;
    49     }
    50     f[0]=1;
    51     for(i=1;i<=n;i++){
    52         LL F=1;
    53         for(j=1;j<=i;j++){
    54             f[i]=(f[i]+F*g[j]*c[i-1][j-1]%mod*f[i-j]%mod*fac[j-1])%mod;
    55             F=-F;
    56         }
    57     }
    58     printf("%lld
    ",(f[n]+mod)%mod);
    59     return;
    60 }
    61 int main(){
    62     int i,j;
    63     A=read();n=read();mod=read();
    64     init();
    65     solve();
    66     return 0;
    67 }
  • 相关阅读:
    Promise 解决回调地狱问题
    同步 异步 API 区别
    静态资源 读取方法
    路由
    HTTP 协议 get post 请求方式
    linux 查看日志
    putty完全使用手册--多窗口---git提交---连接数据库--自动日志显示
    strpos 返回0时 ,比较false 不能加单引号
    禁止使用test类的就是禁止使用本来的$this对象.可以调用父类的对象
    大D实例化model-->调用自定义类方法,大M调用原声model方法
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6901005.html
Copyright © 2011-2022 走看看