4338: BJOI2015 糖果

Time Limit: 2 Sec  Memory Limit: 256 MB

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. 
公式很好写出来
先算出来一行 M 列 填 K 单调不减个数的方法数
即 x1 + x2 + ... xk = M    (xi >= 0)
方案数 为  sum = $C_{M + K - 1} ^ {K - 1}$ = $C_{M + K - 1} ^ {M}$
每行方案不同
总的方案就是  $A_{sum} ^ N$
我们发现 M 不大, 所以可以除数的所有质因子都提出来,然后用分子上的数去除,剩下的就是答案。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define LL long long
  6
  7 using namespace std;
  8
  9 int N, M, K, P;
 10
 11 const int MAXM = 1e5 + 10;
 12
 13 int cnt = 0;
 14 int prime[MAXM];
 15 LL val[MAXM];
 16 int num[MAXM];
 17 int f[MAXM];
 18
 19 inline LL read()
 20 {
 21     LL x = 0, w = 1; char ch = 0;
 22     while(ch < '0' || ch > '9') {
 23         if(ch == '-') {
 24             w = -1;
 25         }
 26         ch = getchar();
 27     }
 28     while(ch >= '0' && ch <= '9') {
 29         x = x * 10 + ch - '0';
 30         ch = getchar();
 31     }
 32     return x * w;
 33 }
 34
 35 void init()
 36 {
 37     for(int i = 2; i < MAXM; i++) {
 38         if(!f[i]) {
 39             f[i] = i;
 40             prime[++cnt] = i;
 41         }
 42         for(int j = 1; j <= cnt && i * prime[j] < MAXM; j++) {
 43             f[i * prime[j]] = prime[j];
 44             if(i % prime[j] == 0) {
 45                 break;
 46             }
 47         }
 48     }
 49     /*for(int i = 0; i <= 2000; i++) {
 50         c[i][0] = 1;
 51         for(int j = 1; j <= i; j++) {
 52             c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % P;
 53         }
 54     }*/
 55 }
 56
 57 int main()
 58 {
 59     N = read(), M = read(), K = read(), P = read();
 60     init();
 61     for(int j = 0; j < M; j++) {
 62         val[j] = K + j;
 63     }
 64     for(int j = M; j > 1; j--) {
 65         int t = j;
 66         while(t > 1) {
 67             num[f[t]]++;
 68             t = t / f[t];
 69         }
 70     }
 71     int st = K;
 72     for(int i = 1; i <= cnt; i++) {
 73         for(int j = ((st - 1) / prime[i] + 1) * prime[i]; j < K + M; j += prime[i]) {
 74             int t = j - st;
 75             //cout<<prime[i]<<" "<<j<<" "<<val[t]<<" "<<num[prime[i]]<<endl;
 76             while(val[t] % prime[i] == 0 && num[prime[i]]) {
 77                 val[t] /= prime[i];
 78                 num[prime[i]]--;
 79             }
 80             if(num[prime[i]] == 0) {
 81                 break;
 82             }
 83         }
 84     }
 85     LL ans = 1;
 86     for(int i = 0; i < M; i++) {
 87         ans = ans * val[i] % P;
 88     }
 89     //cout<<ans<<" "<<c[M + K - 1][K - 1] % P<<endl;
 90     LL now = ans;
 91     for(int i = 1; i < N; i++) {
 92         ans = ans * (now - i) % P;
 93     }
 94     printf("%lld\n", ans);
 95     return 0;
 96 }
 97
 98 /*
 99
100 100 10 5 1000000000
101
102
103 */

View Code

转载于:https://www.cnblogs.com/wuenze/p/8598153.html

bzoj 4338[BJOI2015] 糖果 - 组合相关推荐

  1. bzoj 4338: BJOI2015 糖果

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

  2. BZOJ 4338 BJOI2015 糖果

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

  3. 4338: BJOI2015 糖果

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

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

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

  5. bzoj 2330: [SCOI2011]糖果

    2330: [SCOI2011]糖果 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...

  6. BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...

  7. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  8. 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)

    这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...

  9. SPFA差分约束(bzoj 2330: [SCOI2011]糖果)

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6355  Solved: 2096 [Submit][Stat ...

最新文章

  1. Distilling the Knowledge in a Neural Network 论文笔记蒸馏
  2. iOS 支付 [支付宝、银联、微信]
  3. NAPI模式--中断和轮询的折中以及一个负载均衡的问题
  4. c语言奇数阶换房,(完整版)C语言酒店管理系统.docx
  5. 硒品牌谋定功能性农业-农业大健康·万祥军:践行健康中国
  6. 从no-code到low-code:企业级hpaPaaS的未来
  7. gradle构建多模块项目_Gradle入门:创建多项目构建
  8. 工作283:抽离出新页面优化
  9. 使用 IntraWeb (41) - 数据控件速查
  10. react周期函数介绍
  11. 实验:DHCP中继代理
  12. 怎么看台式计算机是几位的,电脑多少位在哪里看_如何看电脑系统是多少位-win7之家...
  13. 中国大陆加港澳台手机正则验证
  14. linux 串口转网口工具,linux下串口调试工具/串口终端推荐: picocom(转)
  15. 使用谷歌、360浏览器的F12功能模拟微信访问网页
  16. DNS服务解析与原理笔记
  17. 剑指offter Java单链表反转
  18. Excel技能树系列01:电子表格发展史
  19. unity 标准资源包中的围绕旋转摄像机
  20. 多传感器融合论文已读

热门文章

  1. 怎样判断一个网站是不是模板建站
  2. React 组件设计指南
  3. Ajax技术详解(一)
  4. 一名拿到阿里、京东、百度等公司offer的Java程序员年终总结
  5. HBR推荐 丨验证决策、回归产品——2022年企业需要适应这两大转变
  6. 用C#构建一个几何画板程序
  7. viper4android mx760,下一个MX500?MX760详尽分析评测+多图。
  8. 如何编写一个自动投票程序
  9. 项目--基于http协议的小型web服务器
  10. 连接远程数据库,并通过SQL来获取数据;