矩阵乘法专题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
矩阵乘法专题

矩阵乘法专题 Ⅰ三个袋子 (bags.pas/c/cpp/in/out) 时限:1 sec | 内存: 64 MB 【背景】 平平在公园里游玩时捡到了很多小球,而且每个球都不一样。平平找遍了全身只发现了3个一模一样的袋子。他打算把这些小球都装进袋子里(袋子可以为空)。他想知道他总共有多少种放法。 【题目描述】 将N个不同的球放到3个相同的袋子里,求放球的方案总数M。 结果可能很大,我们仅要求输出M mod K的结果。 现在,平平已经统计出了N=10的所有情况。见下表: N 1 2 3 4 5 6 7 8 9 10 M 1 2 5 14 41 122 365 1094 3281 9842 【输入】 两个整数N,K,N表示球的个数。 【输出】 输出仅包括一行,一个整数M mod K 。 【输入样例】 ( bags.in ) 11 10000 【输出样例】( bags.out ) 9525 【数据规模】 对于 40%数据,10=N=10,000 对于100%数据,10=N=1,000,000,000 对于 100%数据,K=100,000 直接抄题解: 首先观察表格,容易从中看出f(n)=3*f(n-1)-1。但是考虑到数据是10^9会超时,所以不能简单递推。这时有一种猥琐的办法:每隔10000项存一个const,然后从表找出最近的并递推。如果要追求高效,那么可以用二分矩阵乘法去做。其实我们还可以去求数列的通项公式。用不动点或者什么都行,可以求出其通项公式为f(n)=(3^n+3)/6,然后用带mod的快速幂就可以完美解决,效率log2(n)。从纯粹排列组合的角度考虑,有两个方向。一个是每个球都有3种选择,n个球有3^n次种,实际上需要除去重复的部分,即除以3!,而当有两个袋子为空时,只算了三种情况,需要补足,故总个数就是上述的通项公式。另外,可以考虑第一个袋子有放0~n个的可能,第二个有几种可能,如此用加法和乘法原理可以得出一条二项式展开式,从而得出公式,在此不赘述。 注意:在mod运算和减法同时存在时,结果可能会变成负数,只要在最后判断为负数时再加上一个K就可以解决。另外在取mod k之后再用除法运算(除以a),需要在mod时取k*a的值就可以了,在最后还是除以a。 From GriffinHeart PS:贴吧神犇: 对于(a/b) mod c这种形式的式子,可以表示成(a mod (b*c))/b的形式。 证:设x=(a/b) mod c,则存在整数k满足 kc+x=a/b kbc+bx=a 由于xc,所以bxbc 所以bx=a mod bc x=(a mod bc)/b。 PS again:没仔细看 反正记住(a/b) mod c = (a mod (b*c))/b就行了 矩阵代码: #include iostream #include cstdlib #include cstdio #include cstring #include algorithm using namespace std; const int maxn = 1000 + 2; int n, k; template int A, int B struct matrix { int v[A][B]; matrix(int r = 0) { memset(v, 0, sizeof(v)); for (int i = 0; i A i B; i++) v[i][i] = r; } matrix(int a[A][B]) { memcpy(v, a, sizeof(a)); } }; template int A, int B, int C matrixA, C operator * (const matrixA, B a, const matrixB, C b) { matrixA, C c; for (int i = 0; i A; i++) for (int j = 0; j C; j++) { long long v = 0; for (int w = 0; w B; w++) v += a.v[i][w] * b.v[w][j]; c.v[i][j] = (v % k + k) % k; } return c; } template int A matrixA, A power(const matrixA, A a, int b) { matrixA, A ans = 1; for (matrixA, A t = a; b; b = 1) { if (b 1) ans = ans * t; t = t

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档