hdu4767_Bell_矩阵快速幂+中国剩余定理
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
按照上述递推式,利用矩阵快速幂可以得到 Bn mod p, (p = 31, 37, 41, 43, 47),因为p最大47,所以矩阵快速幂O(p^3 * log(n/p))不会超时,
当然要先利用以下公式把B1-B47预处理出来:
得到5个Bn mod p (p = 31, 37, 41, 43, 47)之后,怎样得到Bn mod Π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_矩阵快速幂+中国剩余定理的更多相关文章
- HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...
- hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)
Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...
- M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- hdu4549矩阵快速幂+费马小定理
转移矩阵很容易求就是|0 1|,第一项是|0| |1 1| |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(m ...
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submi ...
- 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)
M斐波那契数列 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Li ...
- hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- No_Sql总结
NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是对不同于传统的关系型数据库的数据库管理系统的统称.在现代的计算系统上每天网络上都 ...
- .NET基础拾遗
原帖地址: http://www.cnblogs.com/edisonchou/p/4787775.html
- 给WPF文字加多条修饰线
原文:给WPF文字加多条修饰线 这是上篇WPF中的文字修饰--上划线,中划线,基线与下划线 最后留给朋友思考的问题. 效果图: XAML代码:<Page xmlns="http://s ...
- python3使用Lxml库操作XPath
download address: http://pypi.python.org/pypi/lxml/2.3 lxml is a Pythonic, mature binding for the li ...
- 使用bcc32做在windowXP上qt3.2.1编译环境的配置
1.安装borland C++编译器,编译器文件所在目录下的文件如下: 其中bcc32.cfg和ilink32.cfg文件是自己加进去的,bcc32.cfg内容是-I"C:\Borland\ ...
- scipy —— 丰富的子包(io、cluster)
io,顾名思义,input/output,输入输出接口: 1. io Input and output (scipy.io) - SciPy v0.18.1 Reference Guide wavfi ...
- WPF-Button|IsCancel&&IsDefault
原文:WPF-Button|IsCancel&&IsDefault Button个别属性 <Button ToolTip="ESC" IsDefault=&q ...
- 好用的Markdown 编辑器及工具
Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,所以通过同一个名字它可以使用工具来转换成 HTML.readme 文件,在线论坛编写消息和快速创建富文本 ...
- STM32 模拟I2C (STM32F051)
/** ****************************************************************************** * @file i2c simu. ...
- WPF 柱状图显示数据
<Window x:Class="Wpf180706.Window9" xmlns="http://schemas.microsoft.com/win ...