51Nod 1362 搬箱子 —— 组合数(非质数取模) (差分TLE)

题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1362

首先,\( f[i][j] \) 是一个 \( i \) 次多项式;

如果考虑差分,用一个列向量维护 0 次差分到 \( n \) 次差分即可,在第 \( n \) 次上差分数组已经是一个常数;

最后一行再维护一个 0 次差分的前缀和,0 次差分其实就是答案;

为了预处理 0 位置上的各次差分值,一开始先 n^2 求出 \( f[0][0] \) 到 \( f[n][n] \),差分一下得到初始矩阵;

转移就是本层加上下一层的差分值,得到本层的下一个位置,\( n \) 次的差分值不变;

需要注意快速幂时,子函数是不能传超过大约 500*500 的数组的,所以把矩阵开成全局的;

可惜这样是 \( n^{3}logm \),会TLE;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=805;
int n,m,f[xn][xn],d[xn][xn],P;
int upt(int x){while(x>=P)x-=P; while(x<0)x+=P; return x;}
struct N{int a[xn][xn];N(){memset(a,0,sizeof a);}void init(){for(int i=0;i<=n+1;i++)a[i][i]=1;}void clr(){memset(a,0,sizeof a);}N operator * (const N &y) const{N ret;for(int i=0;i<=n+1;i++)for(int k=0;k<=n+1;k++)for(int j=0;j<=n+1;j++)ret.a[i][j]=upt(ret.a[i][j]+(ll)a[i][k]*y.a[k][j]%P);return ret;}
}a,g,t;
void print(N a)
{for(int i=0;i<=n+1;i++,puts(""))for(int j=0;j<=n+1;j++)printf("%d",a.a[i][j]);
}
void pw(int b)//
{t.init();for(;b;b>>=1,g=g*g)if(b&1)t=t*g;
}
int main()
{while(scanf("%d%d%d",&n,&m,&P)!=EOF){memset(f,0,sizeof f);memset(d,0,sizeof d);f[0][0]=1;for(int i=0;i<=n;i++)for(int j=0;j<=n;j++){if(i)f[i][j]=upt(f[i][j]+f[i-1][j]);if(j)f[i][j]=upt(f[i][j]+f[i][j-1]);if(i&&j)f[i][j]=upt(f[i][j]+f[i-1][j-1]);}for(int j=0;j<=n;j++)d[0][j]=f[n][j];for(int i=1;i<=n;i++)for(int j=0;j<=n-i;j++)d[i][j]=upt(d[i-1][j+1]-d[i-1][j]);a.clr(); g.clr(); t.clr();for(int i=0;i<=n;i++)a.a[i][0]=d[i][0];for(int i=0;i<n;i++)g.a[i][i]=g.a[i][i+1]=1;g.a[n][n]=1;g.a[n+1][0]=g.a[n+1][n+1]=1;pw(m);int sum=0;for(int i=0;i<=n+1;i++)sum=upt(sum+(ll)t.a[0][i]*a.a[i][0]%P),sum=upt(sum+(ll)t.a[n+1][i]*a.a[i][0]%P);printf("%d\n",sum);}return 0;
}
差分+矩阵快速幂

其实可以考虑组合数:

因为斜着走既向下又向右,不好判断,所以不妨枚举斜着走了几格,假设 \( n<=m \),得到

\( ans = \sum\limits_{j=0}^{m} \sum\limits_{i=0}^{n} C_{i+j}^{i} * C_{j}^{n-i} \)

即 \( ans = \sum\limits_{j=0}^{m} \sum\limits_{i=0}^{n} C_{n}^{i} * C_{i+j}^{n} \),或者其实可以直接写出这个式子;

然后 \( ans = \sum\limits_{i=0}^{n} C_{n}^{i} * \sum\limits_{j=0}^{m} C_{i+j}^{n} \)

\( ans = \sum\limits_{i=0}^{n} C_{n}^{i} * C_{i+m+1}^{n+1} \)

于是求组合数即可;

但模数不是质数,没有逆元;

可以像扩展 Lucas 的做法一样,提取出模数的质因子,剩余的部分就和模数互质,可以用 exgcd 求逆元;

质因子的部分直接把次数加减即可。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=805,xm=35;
int n,m,mod,p[xm],cnt,t[xm];
void div(int x)
{for(int i=2;i*i<=x;i++){if(x%i)continue;p[++cnt]=i;while(x%i==0)x/=i;}if(x>1)p[++cnt]=x;
}
ll pw(ll a,int b)
{ll ret=1;for(;b;b>>=1,a=(a*a)%mod)if(b&1)ret=(ret*a)%mod;return ret;
}
void exgcd(int a,int b,int &x,int &y)
{if(!b){x=1; y=0; return;}exgcd(b,a%b,y,x);y-=a/b*x;
}
int inv(int a,int b){int x,y; exgcd(a,b,x,y); return (x%b+b)%b;}//%b
int get(int x,int tp)
{for(int i=1;i<=cnt;i++){if(x%p[i])continue;int cnt=0;while(x%p[i]==0)cnt++,x/=p[i];t[i]+=cnt*tp;}return x;
}
int C(int n,int m)
{if(n<m)return 0;//!!if(m==0)return 1;memset(t,0,sizeof t);int ret=1;for(int i=n-m+1;i<=n;i++)ret=(ll)ret*get(i,1)%mod;for(int i=1;i<=m;i++)ret=(ll)ret*inv(get(i,-1),mod)%mod;for(int i=1;i<=cnt;i++)ret=(ll)ret*pw(p[i],t[i])%mod;return ret;
}
int main()
{while(scanf("%d%d%d",&n,&m,&mod)==3){cnt=0; div(mod); int ans=0;for(int i=0;i<=n;i++)ans=(ans+(ll)C(n,i)*C(i+m+1,n+1))%mod;printf("%d\n",ans);}return 0;
}

 

转载于:https://www.cnblogs.com/Zinn/p/10063252.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

错误处理在Spring Integration中如何工作

1.引言 这篇文章的目标是向您展示将消息传递系统与Spring Integration结合使用时如何处理错误。 您将看到同步和异步消息传递之间的错误处理有所不同。 和往常一样&#xff0c;我将跳过聊天并继续进行一些示例。 您可以在github上获取源代码。 2&#xff0c;样品申请 我将使用…

原生js、jQuery实现选项卡功能

在大家在网上平常浏览网页的时候&#xff0c;想必各位都会看到选项卡功能&#xff0c;在这里给大家详解一下用原生js、jQuery如何来写一些基本的选项卡 话不多说&#xff0c;先给各位看一下功能图&#xff1a; 好了&#xff0c;下边开始写代码了&#xff1a; HTML代码&#x…

.NET core2.0 发布至IIS中

.NET CORE和asp.net 发布时不太一样&#xff0c;ASP.NET Core不再是由IIS工作进程&#xff08;w3wp.exe&#xff09;托管&#xff0c;而是使用自托管Web服务器&#xff08;Kestrel&#xff09;运行&#xff0c;IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Co…

如何用纯 CSS 创作一个文本淡入淡出的 loader 动画

效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。https://codepen.io/comehope/pen/ERwpeG可交互视频此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打开观…

《机器学习基石》第一周 —— When Can Machine Learn?

&#xff08;注&#xff1a;由于之前进行了吴恩达机器学习课程的学习&#xff0c;其中有部分内容与机器学习基石的内容重叠&#xff0c;所以以下该系列的笔记只记录新的知识&#xff09; 《机器学习基石》课程围绕着下面这四个问题而展开&#xff1a; 主要内容&#xff1a; 一、…

如何用纯 CSS 创作一盘传统蚊香

效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。https://codepen.io/comehope/pen/BVpvMz可交互视频教程此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打…

[Unity3D]Unity3D游戏开发之怪物AI

大家好。欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章&#xff0c;我的博客地址为&#xff1a;http://blog.csdn.net/qinyuanpei。在上一篇文章中&#xff0c;我们基本上实现了一个小地图的功能&#xff0c;今天呢&#xff0c;我们来实现怪物AI&#xff0c;所谓怪物AI…

如何把握好 transition 和 animation 的时序,创作描边按钮特效

效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。https://codepen.io/comehope/pen/mKdzZM可交互视频教程此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打…

使用PHREAK算法实现Drools 6性能

Drools 6引入了新的惰性匹配算法。 该算法的详细信息已在之前的两个博客中介绍&#xff1a; RIP RETE时间获得PHREAKY 基于PHREAK堆栈的评估和向后链接 第一篇文章讨论了性能以及为什么算法的批处理和惰性方面难以比较。 “性能的最后一点。 通常&#xff0c;使用PHREAK的单…

PAT 1131 Subway Map

题目链接&#xff1a; https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 思路&#xff1a; 说多了都是泪&#xff0c; Dijstra超时&#xff0c;采用dfs 利用map<pair<int,int>,int>&#xff0c;表示两个点和他们中间的地铁线号 每次…

专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

1、为什么要对 Vue CLI 进行大规模修改&#xff1f; 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版&#xff0c;这种拉模版的方式有几个问题&#xff1a; &#xff08;1&#xff09; 在单个模版里面同时支持太多选项会导致模版本身变得极其复杂和难以维护&#x…

java秒杀时间与服务器时间_Javascript实现秒杀倒计时(时间与服务器时间同步)...

现在有很多网站都在做秒杀商品&#xff0c;而这其中有一个很重要的环节就是倒计时。关于倒计时&#xff0c;有下面几点需要注意&#xff1a;1.应该使用服务器时间而不是本地时间(本地时间存在时区不同、用户自行设置等问题)。2.要考虑网络传输的耗时。3.获取时间时可直接从AJAX…

Python3.5-20190501-廖老师的

python是一门解释型\脚本语言(和js特别像,如果同时学习js和python完全搅浑了.) 在运行py时候是一句一句翻译成cpu识别的机器码,所以速度比较慢.而C程序是运行前直接编译成CPU能执行的机器码&#xff0c;所以非常快. 学习python,就需要安装python.安装的同时会有一个解释器,就是…

如何用纯 CSS 创作一个冒着热气的咖啡杯

效果预览 在线演示 按下右侧的“点击预览”按钮在当前页面预览&#xff0c;点击链接全屏预览。https://codepen.io/zhang-ou/pen/xjXxoz可交互视频教程此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打开观看。…

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏&#xff0c;游戏难度很适中&#xff0c;冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式&#xff0c;场景高低落差的设计&#xff0c;整个画面层次感设计算是一级&#xff0c;喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道&#xff0c;要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码&#xff0c;然后扫码获取用户基本信息的&#xff0c;所以我们可以在网站上用这两种方式开发网站的扫码登录&#xff0c;也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序&#xff08;例如&#xff0c;面向Web或面向服务的&#xff09;都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件&#xff0c;其中包含运行时所需的所有库和应用程序级依赖…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介&#xff1a;Easypanel是一款虚拟主机管理工具&#xff0c;它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装&#xff0c;是一款集虚拟主机、ftp、mysql等功能为一体的管理系统&#xff0c;本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码&#xff0c;看谁聪明“爱死他”。 密文&#xff1a;766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意&#xff1a;&#xff08;1&#xff09;此题由正心41上课的同学做 &#xff08;2&#xff09;第一个提交&#xff0c;答案&#xff1a…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…