• BZOJ3501 : PA2008 Cliquers Strike Back


    [egin{eqnarray*}ans&=&m^{sum_{i=1}^n Stirling2(n,i)mod 999999598}mod 999999599\
    &=&m^{B_nmod 999999598}mod 999999599end{eqnarray*}]

    999999598=2*13*5281*7283,对于每个小质数依次计算,最后用中国剩余定理合并即可。

    对于贝尔数,有

    [egin{eqnarray*}B_{p+n}&equiv&B_n+B_{n+1}(mod p)\
    B_{p^m+n}&equiv&mB_n+B_{n+1}(mod p)end{eqnarray*}]

    根据这两个公式,可以从高位到低位递推,当$n<p$时直接输出解。时间复杂度$O(p^2log p)$。

    #include<cstdio>
    typedef long long ll;
    const int N=7284,P=999999598;
    ll n,m;int a[4]={2,13,5281,7283},f[N],s[2][N],i,j,x;
    int cal(int x,ll n){
      int i,j,k,m=0,b[N],c[N],d[70];
      for(i=0;i<=x;i++)b[i]=f[i]%x;
      while(n)d[m++]=n%x,n/=x;
      for(i=1;i<m;i++)for(j=1;j<=d[i];j++){
        for(k=0;k<x;k++)c[k]=(b[k]*i+b[k+1])%x;
        c[x]=(c[0]+c[1])%x;
        for(k=0;k<=x;k++)b[k]=c[k];
      }
      return c[d[0]];
    }
    ll pow(ll a,ll b,ll p){ll t=1;for(a%=p;b;b>>=1LL,a=a*a%p)if(b&1LL)t=t*a%p;return t;}
    ll bell(ll n){
      if(n<N)return f[n];
      ll t=0;
      for(int i=0;i<4;i++)t=(t+(P/a[i])*pow(P/a[i],a[i]-2,a[i])%P*cal(a[i],n)%P)%P;
      return t;
    }
    int main(){
      f[0]=f[1]=s[0][0]=1,s[0][1]=2;
      for(i=2,x=1;i<N;i++,x^=1)for(f[i]=s[x][0]=s[x^1][i-1],j=1;j<=i;j++)s[x][j]=(s[x^1][j-1]+s[x][j-1])%P;
      scanf("%lld%lld",&n,&m);
      printf("%lld",pow(m,bell(n),P+1));
      return 0;
    }
    

      

  • 相关阅读:
    Windows环境下 配置memcached (php)
    谈谈我是怎么学习PHP的(一)
    重编译Linux命令源代码
    php面向对象学习
    Windows文件系统漏洞
    十分钟能学会的框架,MVC+20个常用函数
    linux系统安装软件方法大全
    oracle基本操作
    MySQL的limit查询优化
    C# winform 可视化操作 Excel文件并读取数据
  • 原文地址:https://www.cnblogs.com/clrs97/p/4714467.html
Copyright © 2020-2023  润新知