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

Solution

考虑这个式子的组合数意义,发现其实就是从$n*k$个物品里面取$\%k=r$件物品的方案数。
所以$f[i][j]$表示放完前$i$个,余数为$j$的方案数。$f[i][j] = f[i-1][j] + f[i - 1][(j - 1 + k) \% k]$,矩乘优化一下就可以了。

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std; LL n,MOD,k,r; struct Matrix
{
LL m[][];
Matrix(){memset(m,,sizeof(m));}
Matrix operator * (const Matrix &b) const
{
Matrix c;
for (int i=; i<; ++i)
for (int j=; j<; ++j)
for (int k=; k<; ++k)
(c.m[i][j]+=m[i][k]*b.m[k][j])%=MOD;
return c;
}
}A,ans; Matrix Qpow(Matrix a,LL b)
{
Matrix ans;
for (int i=; i<; ++i) ans.m[i][i]=;
while (b)
{
if (b&) ans=ans*a;
a=a*a; b>>=;
}
return ans;
} int main()
{
scanf("%lld%lld%lld%lld",&n,&MOD,&k,&r);
for (int i=; i<k; ++i)
{
A.m[i][i]++;
A.m[(i-+k)%k][i]++;
}
ans.m[][]=;
ans=ans*Qpow(A,n*k);
printf("%lld\n",ans.m[][r]);
}

最新文章

  1. 【笔记】jstree插件的基本使用
  2. 如何把Qlik Sense嵌入到Web应用中
  3. 反序列化问题的研究之java篇
  4. java.util.Arrays.sort两种方式的排序(及文件读写练习)
  5. 重温WCF之消息契约(MessageContract)(六)
  6. 51Node 1364--- 最大字典序排列(树状数组)
  7. 《JavaScript修炼之道》读书笔记
  8. SQL Server CONVERT() 函数
  9. ASP.NET MVC 3 Razor Views in SharePoint
  10. careercup-树与图 4.9
  11. Magento入门开发教程
  12. resin 4.0数据源的配置
  13. css3 翻书效果
  14. 那些年,学swift踩过的坑
  15. WPF按钮清空自带样式,以及透明按钮时,Grid的Background属性设置引起&quot;点击&quot;问题.
  16. androidStudio通过svn进行版本控制
  17. 计算机组装:台式机更换CPU
  18. 一个小实例理解js 原型和继承
  19. java_方法引用
  20. HTML辅助方法

热门文章

  1. Github - 修改语言统计
  2. 关于设置服务器为https服务器
  3. 十二、异步工具Timer
  4. Spring MVC 实现Excel的导入导出功能(2:Excel的导入优化和Excel的导出)
  5. Eclipse设置虚拟机参数 (转 构建内存溢出)
  6. csharp:Conversion Between DataTable and List
  7. chrome:插件、跨域、调试....
  8. Spring Data MongoDB 分页查询
  9. 样式 bootstrap purecss Amaze UI 推荐
  10. Google APAC----Africa 2010, Qualification Round(Problem B. Reverse Words)----Perl 解法