题目描述

组合数 C_n^mCnm​ 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数。举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数 C_n^mCnm​ 的一般公式:

C_n^m = \frac{n!}{m!(n-m)!}Cnm​=m!(n−m)!n!​

其中 n! = 1 × 2 × · · · × n。(特别的,当 n = 0 时, n! = 1 ,当 m > n 时, C_n^m =0Cnm​=0 )

小葱在 NOIP 的时候学习了 C_i^jCij​ 和 k 的倍数关系,现在他想更进一步,研究更多关于组合数的性质。小葱发现, C_i^jCij​ 是否是 k 的倍数,取决于 C_i^j mod kCij​modk 是否等于 0,这个神奇的性质引发了小葱对 mod 运算(取余数)的兴趣。现在小葱选择了是四个整数n; p; k; r,小葱现在希望知道

\sum_{i=0}^{\inf} C_{nk}^{ik+r} mod p∑i=0inf​Cnkik+r​modp

的值。

输入输出格式

输入格式:

第一行有四个整数 n; p; k;r,所有整数含义见问题描述。

输出格式:

一行一个整数代表答案。

输入输出样例

输入样例#1: 复制

2 10007 2 0
输出样例#1: 复制

8
输入样例#2: 复制

20 10007 20 0
输出样例#2: 复制

176

说明

• 对于 30% 的测试点, 1 ≤ n; k ≤ 30, p 是质数;

• 对于另外 5% 的测试点, p = 2;

• 对于另外 5% 的测试点, k = 1;

• 对于另外 10% 的测试点, k = 2;

• 对于另外 15% 的测试点, 1 ≤ n ≤ 10^3; 1 ≤ k ≤ 50, p 是质数;

• 对于另外 15% 的测试点, 1 ≤ n × k ≤ 10^6, p 是质数;

• 对于另外 10% 的测试点, 1 ≤ n ≤ 10^9; 1 ≤ k ≤ 50, p 是质数;

• 对于 100% 的测试点, 1 ≤ n ≤ 10^9; 0 ≤ r < k ≤ 50; 2 ≤ p ≤ 2^30 − 1。

作为省选的T3出题人居然给了60分的暴力分,太良心了QWQ..

不过正解是死活想不到啊

设$C[i][j]$表示从$i$个元素中,拿所有满足$x \%k=j $ 的 $x$个元素的方案数

那么对于第$i$个元素,

不选的方案数为$C[i-1][j]$

选的方案数为$C[i-1][(j-1+k)%k]$

很显然

可以用矩阵快速幂优化

然后就做完了

这题的关键是把杨辉三角的递推与题目中给出的式子相结合,找到题目中式子的一般规律,

进而通过更高科技的算法优化

注意$k=1$的特殊情况

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=1e6;
inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int N,mod,k,r;
int C[][];
struct Matrix
{
int a[][];
Matrix(){memset(a,,sizeof(a));}
};
Matrix mul(Matrix x,Matrix y)
{
Matrix c;
for(int kk=;kk<=k-;kk++)
for(int i=;i<=k-;i++)
for(int j=;j<=k-;j++)
c.a[i][j]=(c.a[i][j]+x.a[i][kk]*y.a[kk][j]%mod)%mod;
return c;
}
void out(Matrix x)
{
for(int i=;i<=k-;i++,puts("\n"))
for(int j=;j<=k-;j++)
printf("%d ",x.a[i][j]);
}
Matrix fastpow(Matrix a,int p)
{
Matrix base;
for(int i=;i<=k;i++) base.a[i][i]=;
while(p)
{
if(p&) base=mul(base,a);
a=mul(a,a);
p>>=;
}
return base;
}
main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#endif
N=read(),mod=read(),k=read(),r=read();
Matrix tmp;
for(int i=;i<=k-;i++)
tmp.a[i][i]=tmp.a[i][i+]=;
tmp.a[k-][]++;tmp.a[k-][k-]++;
Matrix ans;
ans.a[][]=;
tmp=fastpow(tmp,N*k);
ans=mul(ans,tmp);
printf("%lld",ans.a[][r]);
return ;
}

洛谷P3746 [六省联考2017]组合数问题的更多相关文章

  1. P3746 [六省联考2017]组合数问题

    P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)\%k}+dp_{ ...

  2. 洛谷 P3747 [六省联考2017]相逢是问候 解题报告

    P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...

  3. 洛谷P3750 [六省联考2017]分手是祝愿(期望dp)

    传送门 嗯……概率期望这东西太神了…… 先考虑一下最佳方案,肯定是从大到小亮的就灭(这个仔细想一想应该就能发现) 那么直接一遍枚举就能$O(nlogn)$把这个东西给搞出来 然后考虑期望dp,设$f[ ...

  4. 洛谷 P3745 [六省联考2017]期末考试

    题目描述 有 nnn 位同学,每位同学都参加了全部的 mmm 门课程的期末考试,都在焦急的等待成绩的公布. 第 iii 位同学希望在第 tit_iti​ 天或之前得知所有课程的成绩.如果在第 tit_ ...

  5. 洛谷P3749 [六省联考2017]寿司餐厅

    传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...

  6. 洛谷P3745 [六省联考2017]期末考试

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  7. 洛谷 P3750 [六省联考2017]分手是祝愿

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  8. 洛谷P3747 [六省联考2017]相逢是问候

    传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...

  9. 洛谷$P3749$ [六省联考2017] 寿司餐厅 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 这道题好烦昂,,,就给了好多变量,,,但仔细读一遍题还是能$get$的所以我就不再提取一遍题目大意辣$QwQ$? 显然考虑建两排点,一排收益一排支出然后最小 ...

随机推荐

  1. 杭电2602 Bone Collector 【01背包】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 解题思路:给出一个容量为V的包,以及n个物品,每一个物品的耗费的费用记作c[i](即该物品的体积 ...

  2. 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)

    原文地址:http://www.cnblogs.com/baiboy/p/orc4.html   阅读目录 目录 Cache Fusion 原理 什么是 Cache Fusion? 什么是高可用 FA ...

  3. JDBC连接MySQL数据库(一)——数据库的基本连接

    JDBC的概念在使用之前我们先了解一下JDBC的概念, JDBC的全称是数据库连接(Java Database Connectivity),它是一套用于执行SQL语句时的API,应用程序可以通过这套A ...

  4. tree -l命令参考

    一.简介 Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层.第4层和第7层交换机的功能.主要提供loadbalancing( ...

  5. 漫谈 Google 的 Native Client(NaCl) 技术(二)---- 技术篇(兼谈 LLVM)

    转自:http://hzx5.blog.163.com/blog/static/40744388201172531637729/ 漫谈 Google 的 Native Client(NaCl) 技术( ...

  6. HDU1527 - 取石子游戏【威佐夫博弈】

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者. ...

  7. CSS中选择器优先级的权重计算

    CSS中选择器优先级的权重计算 先看一段代码,如下: a{ color: red; } #box a{ color: green; } [class="box"] a{ color ...

  8. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  9. OA项目知识总结2

    BaseAction的抽取 项目中的每个实体类都对应一个action  每个action都都要继承ActionSupport类 已以及实现ModelDriver接口  并且需要注入service 虽然 ...

  10. Elasticsearch 7.0 发布都有哪些新特性

    了解about云知识星球 .pcb{margin-right:0} 问题导读 1.Elasticsearch&Kibana 7.哪些需要修改? 2.Elasticsearch7 有哪些新特性? ...