2013长春赛区网络赛的1009题

比赛的时候这道题英勇的挂掉了,原因是写错了一个系数,有时候粗心比脑残更可怕

本题是关于Bell数,关于Bell数的详情请见维基:http://en.wikipedia.org/wiki/Bell_number

其中有一句话是这么说的: And they satisfy "Touchard's congruence": If p is any prime bumber then

但95041567不是素数, 分解之后发现 95041567 = 31 × 37 × 41 × 43 × 47

按照上述递推式,利用矩阵快速幂可以得到 Bmod p, (p = 31, 37, 41, 43, 47),因为p最大47,所以矩阵快速幂O(p^3 * log(n/p))不会超时,

当然要先利用以下公式把B1-B47预处理出来:

得到5个Bmod p (p = 31, 37, 41, 43, 47)之后,怎样得到Bmod  Πp 呢?

利用中国剩余定理可以完美的解决上述问题

详情见代码:

#include <cstdio>
#include <cstring> #define MOD 95041567
#define LL long long const int maxn = 50; //必须加 const,否则编译错误
LL x[5] = {31, 37, 41, 43, 47};
LL X; class Matrix {
public:
LL val[maxn][maxn];
Matrix() {
memset(val, 0, sizeof(val));
} Matrix operator*(const Matrix& c) const {
Matrix res;
for (int i = 0; i < X; ++i)
for (int j = 0; j < X; ++j)
for (int k = 0; k < X; ++k) {
res.val[i][j] += val[i][k] * c.val[k][j];
res.val[i][j] = (res.val[i][j] + X) % X; //防止矩阵元素变为负数,若不需要,去掉"+MOD"
}
return res;
} Matrix operator*=(const Matrix& c) {
*this = *this * c;
return *this;
} Matrix Pow(LL k) { //返回one^k
Matrix res = Zero();
Matrix step = One();
while (k) {
if (k & 1)
res *= step;
k >>= 1;
step *= step;
}
return res;
} Matrix Zero() const {
Matrix res;
for (int i = 0; i < X; ++i)
res.val[i][i] = 1;
return res;
} Matrix One() const {
Matrix res;
for (int i = 0; i < X - 1; ++i)
res.val[i][i] = res.val[i + 1][i] = 1;
res.val[0][X - 1] = res.val[1][X - 1] = res.val[X - 1][X - 1] = 1;
return res;
}
}; void gcd(LL a, LL b, LL& d, LL& xx, LL& y) {
if (!b) {
d = a, xx = 1, y = 0;
} else {
gcd(b, a % b, d, y, xx);
y -= xx * (a / b);
}
} LL china(LL n, LL* a, LL* m) {
LL M = 1, d, xx = 0, y;
for (int i = 0; i < n; ++i) M *= m[i];
for (int i = 0; i < n; ++i) {
LL w = M / m[i];
gcd(m[i], w, d, d, y);
xx = (xx + y * w * a[i]) % M;
}
return (xx + M) % M;
} LL c[50][50], f[50], a[5]; int main() {
int T;
for (int i = 0; i < 50; ++i) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; ++j)
c[i][j] = (c[i-1][j] + c[i - 1][j - 1]) % MOD;
}
f[0] = 1;
f[1] = 1;
for (int i = 2; i < 50; ++i) {
for (int j = 0; j < i; ++j)
f[i] = (f[i] + c[i - 1][j] * f[j]) % MOD;
}
scanf("%d", &T);
while (T--) {
LL n;
scanf("%I64d", &n);
if (n < 50) {
printf("%I64d\n", f[n]);
continue;
}
memset(a, 0 ,sizeof(a));
for (int i = 0; i < 5; ++i) {
X = x[i];
Matrix m;
m = m.Pow(n / X);
for (int j = 0; j < X; ++j)
a[i] = (a[i] + f[j] * m.val[j][n % X]) % X;
}
printf("%I64d\n", china(5, a, x));
}
return 0;
}

  

hdu4767_Bell_矩阵快速幂+中国剩余定理的更多相关文章

  1. HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)

    传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...

  2. hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

    Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...

  3. M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  4. hdu4549矩阵快速幂+费马小定理

    转移矩阵很容易求就是|0  1|,第一项是|0| |1  1|             |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(m ...

  5. HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  6. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  7. HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

    M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  8. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  9. hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

    题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. DapperPoco

    DapperPoco -- 基于Dapper的.轻量级的.高性能的.简单的.灵活的ORM框架 为什么要重复造轮子 因为现有的轮子都在某些方面不太令我满意,下面我来一一点评一下,欢迎拍砖. Entity ...

  2. elasticsearch start

    启动.停止服务 默认官方版启动: linux:./bin/elasticsearch start window:直接运行bin/elasticsearch.bat 默认官方版停止: linux:kil ...

  3. spring集成Quartz时区问题造成任务晚执行八小时

    项目中在Spring中集成了Quartz,配置的每日凌晨执行的定时任务都是到了八点多才执行,经过一番查找,可能是时区问题造成的. 一种解决办法是在JVM启动参数中增加 --Duser.timezone ...

  4. Android如何获得系统版本

    如何获得Android系统版本 项目移植中,遇到需要区分不同系统版本的问题.于是查找相关方法如下: android.os.Build类提供了当前系统信息. 可用if (Build.VERSION.SD ...

  5. yii的简单片段缓存

    $dependency = [    'class' => 'yii\caching\DbDependency',    'sql' => 'SELECT MAX(u_id) FROM u ...

  6. Notice: Undefined index: user in D:\phpStudy\WWW\js\ls\lsmc\php\add.php on line 9

    原文:Notice: Undefined index: user in D:\phpStudy\WWW\js\ls\lsmc\php\add.php on line 9 (初用数据库(mysql)做用 ...

  7. c语言学习笔记(3)——输入输出

    一.基本的输入和输出函数的用法 printf()  //屏幕输出 用法: (1)printf("字符串\n"); (2)printf("输出控制符", 输出参数 ...

  8. express的路由规则

    路由规则 express 封装了多种 http 请求方式,我们主要只使用 get 和 post 两种. get 和 post 的第一个参数都为请求的路径,第二个参数为处理请求的回调函数,回调函数有两个 ...

  9. zendframework 初始化配置

    https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#environment-specific-system- ...

  10. c# WebApi POST请求同时包含数据及其文件

    原因:创建.net WebApi的接口API.IIS作为服务端.安卓作为客户端发送json文件及其文件. Android端使用xUtils3.0实现文件上传 java代码: //要传递给服务器的jso ...