当前位置: 首页 > news >正文

P5481 [BJOI2015] 糖果 分析

题目概述

给出 \(n,m,k,p\),表示 \(n\)\(m\) 列,然后每 \(n\) 行填充一个单调不下降的序列且数值为 \([1,k]\)

任意两行之间至少需要一列不同。

\(1\leq n,m\leq 10^5,1\leq k,p\leq 2\cdot 10^9.\)

分析

本质上就是组合计数。

首先考虑一行有多少种选择,要是这个选择为 \(t\),那么最终的答案就是 \(A_{t}^n\)

考虑怎么求 \(t\),套路地,映射到数组上。

首先有 \(1\leq a_1\leq a_2\leq \dots\leq a_m\leq k\)

套路地令 \(b_i=a_i+i\),然后:

\[1< b_1<b_2<\dots<b_m\leq k+m \]

这相当于选择几个数然后自动排序,所以说一行的答案就是 \(\binom{k+m-1}m\)

考虑求这个东西,因为 \(p\) 不是质数,显然往 exlucas 方面想,发现 \(p\) 太大,exlucas 可能 TLE,因此我们只需要利用它的思路即可。

分解质因数然后CRT合并即可

对于求取模结果,只需要和exlucas类似地搞一下这个即可,这一部分最多时间复杂度 \(\mathcal{O}(m\log k)\)

直接做就行了。

代码

时间复杂度 \(\mathcal{O}(n+m\log k)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <map>
#define int long long
//#define N 
using namespace std;
#define isdigit(ch) ('0' <= ch && ch <= '9')
template<typename T>
void read(T&x) {x = 0;char ch = getchar();for (;!isdigit(ch);ch = getchar());for (;isdigit(ch);ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
}
template<typename T>
void write(T x) {if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
int qpow(int a,int b,int mod) {int res = 1;while(b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
int gcd(int a,int b) {return b ? gcd(b,a % b) : a;
}
void exgcd(int a,int b,int &x,int &y) {if (b == 0) return x = 1,y = 0,void();int xx,yy;exgcd(b,a % b,xx,yy);x = yy,y = xx - a / b * yy;
}
int inv(int a,int mod) {int x,y;int g = gcd(a,mod);if (g ^ 1) return -1;exgcd(a,mod,x,y);return (x % mod + mod) % mod;
}
bool check(int n,int m,int lim) {int res = 1;for (int i = 1;res < lim && i <= m;res = res * (n - i + 1) / i,i ++);if (res < lim) return false;return true;
}
int C(int n,int m,int p,int pk) {int fz = 1,fm = 1;int cnt1 = 0,cnt2 = 0;for (int i = 1;i <= m;i ++) {int x = n - m + i;while(x % p == 0) x /= p,cnt1 ++;fz = fz * (x % pk) % pk;int y = i;while(y % p == 0) y /= p,cnt2 ++;fm = fm * (y % pk) % pk;}return fz * inv(fm,pk) % pk * qpow(p,cnt1 - cnt2,pk) % pk;
}
vector<pair<int,int>> factor;
vector<int> a,b;
signed main(){int n,m,k,p;read(n),read(m),read(k),read(p);if (p == 1) return putchar('0'),0;if (!check(m + k - 1,m,n)) return putchar('0'),0;int t = p;for (int i = 2;i * i <= t;i ++)if (t % i == 0) {int cnt = 0;while(t % i == 0) cnt ++,t /= i;factor.push_back({i,cnt});}if (t > 1) factor.push_back({t,1});for (auto i : factor) {int pk = i.first;for (int j = 1;j < i.second;j ++) pk = pk * i.first;int t = C(m + k - 1,m,i.first,pk),res = 1;for (int j = 0;j < n;j ++) res = res * (t - j) % pk;a.push_back(res),b.push_back(pk);}t = 1;for (auto i : b) t = t * i;int res = 0,temp;for (int i = 0;i < a.size();i ++) temp = t / b[i],res = (res + temp * a[i] % p * inv(temp,b[i]) % p) % p;write(res);return 0;
}
http://www.jsqmd.com/news/1250621/

相关文章:

  • 栈在递归中的应用
  • 纯网页免安装 TOP13 MBTI 测评入口,点开链接即可开启人格自测 - 时讯资讯
  • 南昌明档厨房火锅店推荐|同城多场景聚餐火锅门店盘点 - 品牌2026推荐
  • 20K芯片在天然产物靶点筛选中的应用价值
  • 2026年扭矩传感器品牌排行榜正式发布,广东犸力口碑爆棚,强势入选十大推荐排名 - 品牌速递
  • LoRA 适配器家族 — 从原版到新秀
  • 2026东莞广告标牌UV打印机/小型UV打印机怎么选?源头厂家选购避坑指南 - mobible
  • 2026最新指标测评|企业引入AI数字员工,团队如何筛选适配的服务商?
  • 2026年7月最新浪琴南昌恒隆广场维修保养服务电话 - 浪琴官方售后服务中心
  • 被低估的AI自动化临界点(单点突破→全链路提效的4.7天拐点实测数据)
  • 南昌脆毛肚火锅推荐|同城多场景聚餐门店觅食指南 - 品牌2026推荐
  • 数据结构篇(六):线性表——队列
  • 2026 年至今,彰武正规的蛙人打捞施工厂家哪家好,揭秘:水中“蛙人”打捞的惊人真相 - 企业信息推荐【官方】
  • AI工艺自动调整项目实现第1讲:整个工艺流程;方阻相关的问题;原数据理解;项目总思路;首先要完成的项目1
  • 测力传感器10大品牌推荐,广东犸力测力传感器值得信赖,研发人员推荐之选 - 品牌速递
  • 2026简历制作网站推荐:四款在线简历制作工具模板、AI功能与收费对比 - 春日收信人
  • 2026年绘资质延续人员社保要求
  • Spring Boot 接口幂等实战:用 Token + Redis 防重复提交
  • Micrometer 系列【1】JVM 可观测门面框架全景概述
  • 江诗丹顿中国售后服务中心|电话及维修地址权威信息公告(2026年7月最新) - 江诗丹顿服务中心
  • 2026年7月专业的室内墙面装修材料厂商推荐,旧墙翻新艺术涂料/微水泥艺术涂料,室内墙面装修材料厂商口碑推荐 - 品牌推荐师
  • 20260722 4(+1) 85 18
  • 保姆级教程:MCP 工具链搭建实战——从零配置 AI 编程助手
  • 南昌觅食指南:食材新鲜的重庆火锅门店场景盘点 - 品牌2026推荐
  • Pulsar 消息同步机制
  • 矿山破碎设备液压监测采购,液压传感器十大厂家推荐,广东犸力靠谱使用寿命更长 - 品牌速递
  • APS 需求计划(Demand Planning)技术拆解
  • Go http.Client 实战:连接池复用、超时设置与 context 取消
  • HarmonyOS7 数据持久化:Preferences 和 RDB 到底选哪个?
  • 广州财税服务行业GEO优化公司选型指南丨生成式引擎优化服务商深度测评2026本地榜单解析 - 企业新闻快传