4870: [Shoi2017]组合数问题

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 829  Solved: 446
[Submit][Status][Discuss]

Description

Input

第一行有四个整数 n, p, k, r,所有整数含义见问题描述。
1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1

Output

一行一个整数代表答案。

Sample Input

2 10007 2 0

Sample Output

8

HINT

    注意到问题就是求从n*k件物品中选出若干件使得选出的物品的数量%K=R的不同方案个数,f[i][j]表示从前i件物品中选出若干件满足选出物品的数量%K=j的方案个数,有f[i][j]=f[i-1][j]+f[i-1][((j-1)+K)%K],显然利用矩阵幂可以快速转移,注意特判下K=1的情况。由于快速幂传参写的是int,但是N*K可能爆int一直WA最后才发现= =

    

 #include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL long long
#define ULL unsigned long long
#define uint unsigned int
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f LL N,P,K,R;
LL qpow(LL a,LL b,LL p){
LL r=;
while(b){
if(b&) r=r*a%p;
a=a*a%p;
b>>=;
}
return r;
}
struct matrix{
LL a[][];
matrix(){
memset(a,,sizeof(a));
}
matrix operator*(matrix& tmp){
matrix ans;
for(int i=;i<K;++i){
for(int j=;j<K;++j){
for(int k=;k<K;++k){
(ans.a[i][k]+=a[i][j]*tmp.a[j][k])%=P;
}
}
}
return ans;
}
}A,I;
matrix qpow(matrix X,LL n){
matrix ans=I;
while(n){
if(n&) ans=ans*X;
X=X*X;
n>>=;
}
return ans;
}
int main(){ scanf("%lld%lld%lld%lld",&N,&P,&K,&R);
N*=K;
if(K==){
printf("%lld\n",qpow(,N,P));
}
else{
for(int i=;i<K;++i) I.a[i][i]=;
A.a[][]=A.a[][K-]=;
for(int i=;i<K;++i){
A.a[i][i]=A.a[i][i-]=;
}
matrix ans=qpow(A,N);
printf("%lld\n",ans.a[R][]);
}
return ;
}

bzoj-4870-组合dp+矩阵幂的更多相关文章

  1. POJ-3744-概率dp+矩阵幂(分段)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10214   Accepted: 2980 Desc ...

  2. nyoj1273 河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  3. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  4. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  5. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  6. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  7. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  8. ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)

    题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...

  9. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

随机推荐

  1. python安装whl文件的注意事项(windows系统)

    首先给大家来一波福利,在没有连接外网(互联网)的情况下,只有公司内网或者断网情况下,需要安装python的一些依赖,不会操作的同学可能就会遇到麻烦.这里教大家离线安装python依赖. 方法:使用.w ...

  2. PL/SQL Developer登入时候报ORA-12638

    在client安装目录,找到打开sqlnet.ora 在里面找到 SQLNET.AUTHENTICATION_SERVICES= (NTS)将其更改为: SQLNET.AUTHENTICATION_S ...

  3. Python自动发布Image service的实现

    使用Python自动发布地图服务已经在上一篇博客中讲到,使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务,下面是利用Python自动发布Image service的实现. -- ...

  4. Servlet + JSP 时代

    Spring,Django,Rails,Express这些框架技术的出现都是为了解决什么问题,现在这些框架都应用在哪些方面? - 知乎 https://www.zhihu.com/question/2 ...

  5. curl命令踩的坑

    使用curl命令执行get请求,带多个参数: curl localhost:/user/binding/query?userId=&wrapperId=&from=test [] [] ...

  6. java-mybaits-00701-与spring整合

    1.1     整合思路   需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSes ...

  7. 301-React Ext-React创建组件的三种方式及其区别

    一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...

  8. KL与JS散度学习[转载]

    转自:https://www.jianshu.com/p/43318a3dc715?from=timeline&isappinstalled=0 https://blog.csdn.net/e ...

  9. R语言编程

    R中的帮助文档非常有用,其中有四种类型的帮助 help(functionname) 对已经加载包所含的函数显示其帮助文档,用?号也是一样的. help.search('keyword') 对已经安装的 ...

  10. 一个简单的3D范例,是在别人基础上面整理的。

    一个简单的范例,是在别人基础上面整理的.原来的例子,框图太乱了,没有条理感. http://pan.baidu.com/s/1eQTyGCE