- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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/bkbc+bx=a由于xc,所以bxbc所以bx=a mod bcx=(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
您可能关注的文档
最近下载
- 雷州市卫生健康局下属事业单位招聘考试真题2024.docx VIP
- 第十章 分式(小结与思考)(单元复习课件)-2023-2024学年八年级数学下册同步课堂(苏科版).pptx VIP
- 儿童故事绘本《嘻哈农场-吱咕、吱咕、嘎》.ppt VIP
- BSEN206-2013欧标欧洲规范.pdf VIP
- 2025年山东发展投资控股集团有限公司人员招聘笔试备考试题含答案详解.docx VIP
- 第二届全国健康照护行业职业技能竞赛(健康照护师)理论试题库-下(判断题汇总).docx VIP
- 2025年人工智能训练师(五级)初级资格理论考试练习题库(460题)含答案.docx VIP
- 重庆市西南师大附中高一上学期期末考试(化学).doc VIP
- 一种人工沙滩.pdf VIP
- 广汽丰田C-HR EV_车型手册电子版下载_非汽车用户车主车辆使用操作驾驶说明书.pdf VIP
文档评论(0)