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. React Native中的DeviceEventEmitter.addListener与DeviceEventEmitter.emit

    官方文档没有对这两个方法做很好的解释,需要自己找资料研究.看了几篇文章,总结是和订阅发布模式差不多,用来事件监听发送的. React Native学习之DeviceEventEmitter传值   R ...

  2. sublime Package Control 设备

    sublime  插件的官方网站 https://sublime.wbond.net/ 点击Installation watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...

  3. 数据访问层之Repository

    数据访问层之Repository   接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...

  4. Obtaining Directory Change Notifications(微软的例子,使用FindFirstChangeNotification,FindNextChangeNotification,FindCloseChangeNotification API函数)

    An application can monitor the contents of a directory and its subdirectories by using change notifi ...

  5. Android中去掉标题的方法总结

    方法一:也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码: requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标 ...

  6. Leetcode 242 Valid Anagram 字符串处理

    字符串s和字符串t是否异构,就是统计两个字符串的a-z的字符数量是否一值 class Solution { public: bool isAnagram(string s, string t) { ] ...

  7. Python类型和对象

    关键字:Python 类型 对象原文:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects 关于本书 解释新式的Python对象(new-style ...

  8. 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)

    原文:深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView) 很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提 ...

  9. WPF动画旋转(3轴同时旋转问题)

    原文:WPF动画旋转(3轴同时旋转问题) WPF的资料比较少,做起来不是很方便,之前一直有个XYZ3个轴同时旋转的问题,开始的时候以为通过  this.theRotateX.Axis = new Ve ...

  10. 生意经:凡是现今比较会赚钱或是规模比较大的软件公司大都属于开发"消费型软件"的公司(而且登广告,应该定低价进行销售)

    c#之父是Anders Hejlsberg, 一个丹麦天才.他和idsoft的John Carmack都是自学成才的典范. 他对语言和汇编的理解全世界没几个人能超越. (今天偶然从网上了解到这个大牛, ...