
例如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;
}
原文:http://blog.csdn.net/u010579068/article/details/45587911