4338: BJOI2015 糖果

Time Limit: 2 Sec  Memory Limit: 256 MB
Submit: 141  Solved: 66
[Submit][Status][Discuss]

Description

Alice 正在教她的弟弟 Bob 学数学。 
每天,Alice 画一个N行M 列的表格,要求 Bob在格子里填数。 
Bob已经学会了自然数1到K的写法。因此他在每个格子里填1 ~ K之间的整数。 
Alice 告诉 Bob,如果 Bob 填写完表格的 N*M 个数以后,每行的数从第 1 列到第 M
列单调不减,并且任意两行至少有一列的数不同,而且以前 Bob 没有填写过相同的表格,
那么Alice 就给Bob吃一颗糖果。 
Bob想知道,如果每天填写一遍表格,最多能吃到多少颗糖果。 
答案模P输出。 

Input

第一行,四个整数依次是N, M, K, P。 

Output

输出一行,一个整数,表示答案模P 后的结果。 

Sample Input

【样例输入1】
1 3 3 10
【样例输入2】
2 2 2 10

Sample Output

【样例输出1】
0
【样例输出2】
6

HINT

【样例解释】 
样例1。表格只有一行。每个格子可以填写1 ~ 3。有10种填写方法,依次为1 1 1,
1 1 2,1 1 3,1 2 2,1 2 3,1 3 3,2 2 2,2 2 3,2 3 3,3 3 3。   
样例2。表格有两行。有6 种填写方法,依次为  1 1/1 2, 1 1/2 2, 1 2/1 1, 1 2/2 
2, 2 2/1 1, 2 2/1 2。 
【数据规模与约定】 
100% 的数据中,1 ≤ N, M ≤ 10^5,1 ≤ P, K ≤ 2*10^9. 

Source

[Submit][Status][Discuss]



#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<bitset>
using namespace std;const int maxn = 1E5 + 10;
typedef long long LL;LL N,M,K,P,r1,a1,fac[maxn],inv[maxn];
int tot,pri[maxn];
bool not_pri[maxn];void Extend_Gcd(LL a,LL &x,LL b,LL &y)
{if (!b) {x = 1; y = 0; return;}Extend_Gcd(b,y,a%b,x); y -= x*(a/b);
}LL C(int n,int m,LL g)
{if (m > n) return 0;LL Inv = inv[m]*inv[n-m]%g;return fac[n]*Inv%g;
}LL Lucas(LL n,LL m,LL g)
{if (!m) return 1;return Lucas(n/g,m/g,g)*C(n%g,m%g,g)%g;
}LL ksm(LL x,int y,LL g)
{LL ret = 1;for (; y; y >>= 1){if (y&1) ret = ret*x%g;x = x*x%g;}return ret;
}void Work(LL a2)
{LL sum = 1,r2 = 1;if (a2 < maxn){fac[0] = 1;for (LL i = 1; i < a2; i++) fac[i] = fac[i-1]*i%a2;inv[a2-1] = ksm(fac[a2-1],a2-2,a2);for (LL i = a2-2; i >= 0; i--) inv[i] = inv[i+1]*(i+1)%a2;sum = Lucas(K + M - 1,M,a2);}else{for (LL i = 1; i <= M; i++){sum = sum*(K + M - i)%a2; LL x,y; Extend_Gcd(i,x,a2,y);sum = sum*x%a2;}}for (int i = 0; i < N; i++) r2 = r2*(sum-i)%a2;r2 = (r2 + a2) % a2;if (!a1) {r1 = r2; a1 = a2; return;}LL x,y,k1,g; Extend_Gcd(a1,x,a2,y);k1 = (r2 - r1)*x%a2; k1 = (k1 + a2) % a2;g = a1*a2; r1 = (k1*a1%g + r1) % g; a1 = g;
}int main()
{#ifdef DMCfreopen("DMC.txt","r",stdin);#endiffor (int i = 2; i < maxn; i++){if (!not_pri[i]) pri[++tot] = i;for (int j = 1; j <= tot; j++){int Nex = i*pri[j];if (Nex >= maxn) break;not_pri[Nex] = 1;if (i % pri[j] == 0) break;}}cin >> N >> M >> K >> P; int _P = P;for (int i = 1; i <= tot; i++){if (_P % pri[i] != 0) continue;while (_P % pri[i] == 0) _P /= pri[i];Work(pri[i]);}if (_P > 1) Work(_P);cout << r1;return 0;
}

4338: BJOI2015 糖果相关推荐

  1. bzoj 4338[BJOI2015] 糖果 - 组合

    4338: BJOI2015 糖果 Time Limit: 2 Sec  Memory Limit: 256 MB Description Alice 正在教她的弟弟 Bob 学数学.  每天,Ali ...

  2. bzoj 4338: BJOI2015 糖果

    4338: BJOI2015 糖果 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 200  Solved: 93 [Submit][Status][D ...

  3. BZOJ 4338 BJOI2015 糖果

    此题其实没什么营养就提示了 , 简单推一个公式 , 再上中国剩余定理即可. PnCmm+k−1 P_{C_{m+k-1}^{m}}^{\,n} 其中p<script type="mat ...

  4. [BZOJ4338][BJOI2015]糖果(扩展Lucas)

    先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解. 但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于 ...

  5. BZOJ 4338 糖果(扩展Lucas定理+CRT)

    题目链接:BZOJ 4338 题目大意:用数字1~k填一个n*m的表格,每种数字可用任意次,要求每行数字1~m列单调不减,任意两行不完全相同,求方案数对P取模的值. 题解:扩展Lucas+CRT模板题 ...

  6. 2017.10.6 BJOI2015 bzoj4338 糖果

    糖果 题目背景: bzoj4338 分析:组合数 呜呜呜,为什么你们都推的出组合数······ 本废喵死都没有推出组合数······ 所以我们来详细考虑下这道题目: 首先,我们可以知道,如果我们求出填 ...

  7. LeetCode简单题之公平的糖果交换

    题目 爱丽丝和鲍勃拥有不同总数量的糖果.给你两个数组 aliceSizes 和 bobSizes ,aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃 ...

  8. LeetCode简单题之打折购买糖果的最小开销

    题目 一家商店正在打折销售糖果.每购买 两个 糖果,商店会 免费 送一个糖果. 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 . 比方说,总共有 4 个糖果,价格分别为 ...

  9. LeetCode简单题之分糖果 II

    题目 排排坐,分糖果. 我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友. 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小 ...

最新文章

  1. ASP.NET2.0 文本编辑器FCKeditor的冰冷之心 【月儿原创】
  2. 实验2  使用T-SQL编写程序
  3. 巴克码matlab,matlab编写巴克码
  4. cs架构使用webservice靠谱嘛_使用点评eimele亦餐哪些味道的好吃?口碑靠谱吗?急想知道!...
  5. T-SQL编程基础-基本语法
  6. Android --- ERROR: Failed to resolve: xxx Affected Modules: xxx
  7. linux上安装fio教程,fio工具安装及使用
  8. 再见,Spark!Flink已成气候!
  9. 循环不变式(loop invariant)
  10. android 知识点大全 面试
  11. C语言编程齿轮轮廓线坐标,c语言程序实现齿轮基本参数几何尺寸计算.pdf
  12. CIF,4CIF,QCIF,D1
  13. open SUSE 查看本机ip地址
  14. 东营网站服务器部署,联通东营服务器dns地址
  15. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )
  16. tomcat运行后报错“Address localhost:1099 is already in use”
  17. oracle中栓锁,特定的闩锁和互斥场景
  18. 解决D-LINK DI 504路由器上网掉线问题
  19. WARNING: [Labtools 27-3413] vivado报错调试界面无信号无波形解决方法
  20. 基于IO多路复用的TCP客户端

热门文章

  1. 浏览器是如何工作的 - How Browser works
  2. 最便宜黑群晖(DSM5.0) -硬改 华为 升腾(Centerm) GI945 ATOM N270
  3. 关于普通表单多文件上传的处理方法
  4. 每日一思之多态的理解
  5. 微服务架构与SOA架构
  6. Map 移除指定key元素
  7. 国产机器人抢滩进行时!优艾智合引领智能制造浪潮
  8. 编辑有签名的pdf文档Acrobat Pro DC
  9. java 奇门遁甲代码_关于奇门遁甲学的一些个人理解
  10. 2021-7-28 Java练习题