标签:hdu4767 bell数 中国剩余定理 扩展欧几里德 矩阵快速幂
例如n = 3
{1, 2, 3}
{1} {2, 3}
{1, 2} {3}
{1, 3} {2}
{1} {2} {3}
所以Bell(3) = 5
给你一个n,求Bell(n) % 95041567的值
#include<stdio.h> #include<string.h> #define LL long long #define mod 95041567 #define MM 50 int m[5]={31,37,41,43,47}; int Sti[MM][MM],bell[MM][MM]; int at[5];//各项余数 void stirling2() { memset(Sti,0,sizeof(Sti)); Sti[0][0]=1; for(int i=1;i<=MM;i++) { for(int j=1;j<=i;j++) { Sti[i][j]=(int)(Sti[i-1][j-1]+((LL)j*(LL)Sti[i-1][j])%mod)%mod; } } } void init() { stirling2(); for(int i=0;i<5;i++) { bell[i][0]=1; for(int j=1;j<m[i];j++) { bell[i][j]=0; for(int k=1;k<=j;k++) { bell[i][j]=(bell[i][j]+Sti[j][k])%m[i]; } // printf("%d\t%d\n",j,bell[i][j]); } } } struct Matrix { int mat[MM][MM]; }; Matrix multiply(Matrix a,Matrix b,int M) { Matrix c; memset(c.mat,0,sizeof(c.mat)); for(int i=0;i<M;i++) { for(int j=0;j<M;j++) { if(a.mat[i][j]==0)continue; for(int k=0;k<M;k++) { if(b.mat[j][k]==0)continue; c.mat[i][k]=(c.mat[i][k]+a.mat[i][j]*b.mat[j][k])%M; } } } return c; } Matrix quickmod(Matrix a,int n,int M) { Matrix res; for(int i=0;i<M;i++) { for(int j=0;j<M;j++) res.mat[i][j]=(i==j); } while(n) { if(n&1) res=multiply(res,a,M); n>>=1; a=multiply(a,a,M); } return res; } int work(int n,int M,int k) { Matrix per;//基础矩阵; memset(per.mat,0,sizeof(per.mat)); per.mat[0][M-1]=1; for(int i=1;i<M;i++) { per.mat[i][i]=per.mat[i][i-1]=1; } Matrix tmp=quickmod(per,n/(M-1),M); int ans[MM]; for(int i=0;i<M;i++) { ans[i]=0; for(int j=0;j<M;j++) { ans[i]=(ans[i]+bell[k][j]*tmp.mat[i][j])%M; } } return ans[n%(M-1)]; } void exgcd(int a,int b,int& d,int& x,int &y) { if(!b){d=a;x=1;y=0;} else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } int China(int r) { int Mc=1; int Mi,d,x,y,as=0; for(int i=0;i<r;i++) { Mc*=m[i]; } for(int i=0;i<r;i++) { Mi=Mc/m[i]; exgcd(Mi,m[i],d,x,y); as=(as+Mi*x*at[i])%Mc; } if(as<0) as+=Mc; return as; } int main() { int T,n; scanf("%d",&T); init(); while(T--) { scanf("%d",&n); for(int i=0;i<5;i++) { at[i]=work(n,m[i],i); } int sol=China(5); printf("%d\n",sol); } return 0; }
标签:hdu4767 bell数 中国剩余定理 扩展欧几里德 矩阵快速幂
原文地址:http://blog.csdn.net/u010579068/article/details/45587911