4870: [Shoi2017]组合数问题

Time Limit: 10 Sec  Memory Limit: 512 MB

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
 
题解:
今年的省选题……
题目的要求很简单,就是求满足要求的组合数在膜(?)意义下的和,但这其实是一道假的数学题。
不难发现,对于符合要求的C(n*k)x中的x都有x%k==r
我们考虑组合数最原始的应用:在一堆物品里选一些物品出来,那么题目的含义就是在n*k个物品中选x个物品,使x%k=r,求方案数
这不就是个背包吗?
那么我们设dp数组f[i][j]为前i个物品选出一些物品,使得物品的个数x%k==j
那么不难写出转移方程:f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k](前者表示不选第i个,后者表示选)
这显然是一个线性的递推式,因此我们考虑矩阵乘优化
设矩阵A中A[i][j]表示从%k=i转移到%k=j的方案数
那么我们的目标就是pow(A,n)之后的A[0][r];
初始化的时候,把所有的A[j][j]++,所有A[(j-1+k)%k][j]++(类比上面的转移方程)
然后再来一个单位矩阵一乘就好了。代码见下:
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. using namespace std;
  6. typedef long long LL;
  7. const int N=;
  8. LL n,p,k,r;
  9. struct marx
  10. {
  11. LL m[N][N];
  12. inline void print()
  13. {
  14. for(int i=;i<k;i++)
  15. {
  16. for(int j=;j<k;j++)
  17. printf("%lld ",m[i][j]);
  18. printf("\n");
  19. }
  20. printf("\n");
  21. }
  22. inline void clear(){memset(m,,sizeof(m));}
  23. marx operator * (const marx &b) const
  24. {
  25. marx c;c.clear();
  26. for(int i=;i<k;i++)
  27. for(int j=;j<k;j++)
  28. for(int u=;u<k;u++)
  29. c.m[i][j]=(c.m[i][j]+m[i][u]*b.m[u][j])%p;
  30. return c;
  31. }
  32. }A,B,C;
  33. int main()
  34. {
  35. scanf("%lld%lld%lld%lld",&n,&p,&k,&r);
  36. A.clear(),B.clear(),C.clear();
  37. C.m[][]=;
  38. for(int j=;j<k;j++)
  39. B.m[j][j]=,A.m[(j-+k)%k][j]++,A.m[j][j]++;
  40. LL tmp=n*k;
  41. while(tmp)
  42. {
  43. if(tmp&)B=B*A;
  44. tmp>>=;A=A*A;
  45. }
  46. C=C*B;
  47. printf("%lld\n",C.m[][r]);
  48. }

[BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘的更多相关文章

  1. BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)

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

  2. BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法

    BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...

  3. BZOJ4870: [Shoi2017]组合数问题

    4870: [Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ...

  4. bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)

    为了1A我居然写了个暴力对拍... 那个式子本质上是求nk个数里选j个数,且j%k==r的方案数. 所以把组合数的递推式写出来f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k].. ...

  5. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

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

  6. BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】

    题目链接 BZOJ4870 题解 \[ans = \sum\limits_{i = 0}^{\infty}{nk \choose ik + r} \pmod p\] 发现实际是求 \[ans = \s ...

  7. BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法

    注意到$r<k$ 别问我为什么要强调. 考场上前30分水水. 然后写阶乘的时候大力$n\log {n}$预处理 本机跑的挺快的,然后稳稳的T掉了. 然后就是简单的矩阵乘法了. #include ...

  8. 【BZOJ4870】[Shoi2017]组合数问题 动态规划(矩阵乘法)

    [BZOJ4870][Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < ...

  9. bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]

    4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...

随机推荐

  1. 【转载】OGRE中用到的设计模式

    原文:OGRE中用到的设计模式 1.       单例模式(Singleton) 2.       工厂方法(Factory Method)  3.       适配器模式(Adapter)  4.  ...

  2. Mybatis JPA-集成方案+源码

    2018-04-18 update 当前文章已过时,请访问代码仓库查看当前版本wiki. github https://github.com/cnsvili/mybatis-jpa gitee htt ...

  3. 《图解 HTTP 》阅读 —— 第二章

    第2章 简单的http协议 http 协议用于客户端和服务器端的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 请求报文: 响应报文: 为了能够处理大量的事务,ht ...

  4. JavaScript学习笔记(二)——函数和数组

    第二章 函数简介 1 第一个函数示例 <script language="JavaScript" type="text/JavaScript"> f ...

  5. LeetCode 845——数组中的最长山脉

    1. 题目 2. 解答 2.1 方法一 left 数组表示当前元素左边比当前元素小的元素个数,right 数组数组表示当前元素右边比当前元素小的元素个数.在山脉的中间 B[i] 处,其左边和右边肯定都 ...

  6. dp算法之硬币找零问题

    题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...

  7. JavaScript/Jquery:Validform 验证表单的相关属性解释

    当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.先引用js <script type="text/javasc ...

  8. [C++] Solve "No source available for main()" error when debugging on Eclipse

    In Mac, the issue image: 1. A existing cmake project on disk 2. import this project into Eclipse. 3 ...

  9. Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问题

    Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问 ...

  10. 详讲H5、WebApp项目中常见的坑以及注意事项

    首先我们中会有一些常用的meta标签,如下: <!--防止手机中网页放大和缩小--> <meta name="viewport" content="wi ...