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) ...
随机推荐
- React Native中的DeviceEventEmitter.addListener与DeviceEventEmitter.emit
官方文档没有对这两个方法做很好的解释,需要自己找资料研究.看了几篇文章,总结是和订阅发布模式差不多,用来事件监听发送的. React Native学习之DeviceEventEmitter传值 R ...
- sublime Package Control 设备
sublime 插件的官方网站 https://sublime.wbond.net/ 点击Installation watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...
- 数据访问层之Repository
数据访问层之Repository 接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...
- Obtaining Directory Change Notifications(微软的例子,使用FindFirstChangeNotification,FindNextChangeNotification,FindCloseChangeNotification API函数)
An application can monitor the contents of a directory and its subdirectories by using change notifi ...
- Android中去掉标题的方法总结
方法一:也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码: requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标 ...
- Leetcode 242 Valid Anagram 字符串处理
字符串s和字符串t是否异构,就是统计两个字符串的a-z的字符数量是否一值 class Solution { public: bool isAnagram(string s, string t) { ] ...
- Python类型和对象
关键字:Python 类型 对象原文:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects 关于本书 解释新式的Python对象(new-style ...
- 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)
原文:深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView) 很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提 ...
- WPF动画旋转(3轴同时旋转问题)
原文:WPF动画旋转(3轴同时旋转问题) WPF的资料比较少,做起来不是很方便,之前一直有个XYZ3个轴同时旋转的问题,开始的时候以为通过 this.theRotateX.Axis = new Ve ...
- 生意经:凡是现今比较会赚钱或是规模比较大的软件公司大都属于开发"消费型软件"的公司(而且登广告,应该定低价进行销售)
c#之父是Anders Hejlsberg, 一个丹麦天才.他和idsoft的John Carmack都是自学成才的典范. 他对语言和汇编的理解全世界没几个人能超越. (今天偶然从网上了解到这个大牛, ...