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

P3445 TAN-Dancing in Circles Sol

题目链接

前言

前置知识点:卢卡斯定理,威尔逊定理,不会可以百度,这里给出大概内容。

卢卡斯定理:考虑求 \(\binom{n}{k} \mod p\)。则其值等于 \(p\) 进制分解后的组合的乘积。

威尔逊定理:对于任意素数 \(p\),有 \((p-1)! \equiv -1 \pmod p\)

解法

考虑答案的情况为长度为 \(a_1\) 的环 \(k_1\) 个,\(a_2\) 的环 \(k_2\) 个,以此类推,直到 \(m\),且满足 \(a_1 < a_2 < a_3 < \dots < a_n\),同时还有 \(\sum\limits_{i=1}^{m} k_i = K\)

则有答案为 \(\dfrac{n!}{\prod\limits_{i=1}^{m} {(a_i!)}^{k_i} k_i!} \prod\limits_{i=1}^{m} {(a_i-1)!}^{k_i}\)。化简一下,就是 \(\dfrac{n!}{\prod\limits_{i=1}^{m} {a_i}^{k_i} k_i!}\)。这是基础的。

然后看到模数很小,考虑对于模数下手。

由于 \(2005 = 5\times 401\),所以做完 \(5\)\(401\) 后,使用 CRT 就好了。

尝试开发性质。

性质一:\(a_m \le p\)。证明可以通过观察左侧内容得出。

性质二:\(\forall n \ge p,a_m = p\),考虑 \(a_m < p\),发现答案一定为 \(0\)

性质三:考虑应用性质二,因此有:令 \(q = n/p\),则 \(a_m = q\),证明显然。

因此应用性质三。发现方案数为 \(\dbinom{n}{q\cdot p} \dfrac{\prod_{i=1}^{q}\binom{i\times p}{p}}{q!} \times {(p-1)!}^q\)

考虑拆分这个式子,根据卢卡斯定理,可以得到前面一项 \(\equiv 1\),根据威尔逊定理,最后一项 \(\equiv {(-1)}^q\)

然后考虑第二项,不难拆分成 \(\dfrac{\prod_{i=1}^{q} i\cdot \binom{i\times p - 1}{p-1}}{q!}\),然后变成了\(\prod_{i=1}^{q} \binom{i\times p - 1}{p-1}\)。考察这个式子,发现根据卢卡斯定理,同样等于 1

综上,这一大坨式子,本质为 \({(-1)}^q\)

然后,问题就可以转化到非常小的范围内了,可以 DP,不会的可以去问 DS,这里给出大概内容。

\(dp[i][j]\) 表示前 \(i\) 个人,形成了 \(j\) 个大小为 \(k\) 的圈,那么我们就有两种方案,往前面的圈塞东西,或者增加一个新的大小为 \(l\) 的圈。然后直接大力 DP,做完了。

Code

这里需要注意判数组越界,不然容易RE。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
const int N = 405;
LL n,k,l;
LL chs[N],dp[N][N];
LL DP(LL x,LL y,LL mod){memset(dp,0,sizeof dp);// cout << x << " " << y << " " << mod << "\n";for(int i=l;i<=x;i++){chs[i] = 1;for(int j=i-l+1;j<i;j++)chs[i] = chs[i] * j % mod;}dp[0][0] = 1;for(int i=1;i<=y;i++)for(int j=i*l;j<=x;j++){dp[i][j] = dp[i][j-1] * (j-1) + dp[i-1][j-l] * chs[j];dp[i][j] %= mod;}return dp[y][x];
}
LL solve(int p){if(l > p) return 0;if(l * k > n) return 0;int q = n / p;if(q > k) return 0;if((k - q) * l > n % p) return 0;LL res = DP(n%p,k-q,p);if(q & 1) res = (p -res)% p;return res;
}
int main(){IOS;cin >> n >> k >> l;LL ans1,ans2;ans1 = solve(5);ans2 = solve(401);// cout << ans1 << " " << ans2 << "\n";while(ans2 % 5 != ans1)ans2 += 401;ans2 %= 2005;cout << ans2;return 0;
}
http://www.zskr.cn/news/1446004.html

相关文章:

  • 别再只看像素了!聊聊ADAS摄像头选型时,分辨率、帧率与算力、成本的现实博弈
  • HP服务器Logical Drive状态异常?可能是Smart Array电池的锅!DL360 Gen9更换电池与阵列重建实操记录
  • 从Burp靶场实战到真实渗透:手把手教你挖掘和利用Host头攻击的5种姿势
  • 2026广深沪港靠谱全屋定制品牌评测指南 - 服务品牌热点
  • 京东e卡回收技巧:3分钟找到靠谱线上回收平台 - 团团收购物卡回收
  • 洛阳市 冰箱维修、冰箱清洗 上门服务|维小达冰箱单门、冰箱双门、冰箱三门、冰箱对开门、冰箱多门、冰箱冰柜一站式维保清洗服务 - 维小达科技
  • 2026嘉兴GEO优化服务商深度评测与选型避坑指南 - 品牌报告
  • 电脑显示器哪家好:排名前五 专业测评解析 - 服务品牌热点
  • 车载语音交互设计:如何用NLP与多模态技术降低驾驶分心风险
  • LabelImg从下载到标注:手把手教你用YOLO格式为自定义数据集打标签(附Anaconda虚拟环境配置)
  • 深度解析碧蓝航线Alas脚本:5大智能系统实现24小时全自动游戏管理
  • 终极指南:用TwitchDropsMiner自动化获取Twitch掉落奖励,告别手动观看烦恼!
  • 保姆级避坑指南:在Ubuntu 22.04上搞定DeepStream 6.4、CUDA 12.2和TensorRT 8.6.1.6
  • 告别聊天框:A2UI协议如何重塑AI智能体的动态交互界面
  • 音效生成不再“配不上”画面,Sora 2多模态时序对齐技术全拆解,3步实现帧级声画同步率≥99.8%
  • 工程师实战笔记:双三相电机四矢量SVPWM调制,如何用MATLAB脚本快速计算开关时间?
  • 2026深圳爱彼手表回收平台分级评分榜:行业实测+5大店铺权威评级 - 奢侈品回收测评
  • 实用iOS激活锁绕过指南:5步免费解锁您的iPhone设备
  • 从一次应急响应复盘:Redis未授权访问如何被SSRF“远程遥控”写Shell
  • 聊天机器人进阶开发:对话状态管理、NLG生成与系统集成实战
  • 2026深圳怎么选手表回收商家,五大平台对比 + 新手避坑技巧 - 奢侈品回收测评
  • API网关在生成式AI场景下的四大演进:从流量管控到智能调度中心
  • 告别页面刷新!用react-activation在React 18+项目中实现Vue同款keep-alive(附路由集成与手动清理缓存指南)
  • 生产运营AI痛点拆解:向量空间JBoltAI的思路
  • 琴童考级电钢琴怎么选?6款实测电钢琴推荐,适配1-10级备考需求
  • 别再只盯着模型精度了!用thop和ptflops实测AlexNet/VGG/ResNet,聊聊FLOPs和Params怎么影响你的GPU账单
  • 告别手工分层:3步用AI将任何插画智能分解为可编辑PSD图层
  • 别再死记公式了!手把手教你用HFSS和Matlab FDTD两种方法仿真微带线阻抗(附工程文件)
  • SAP S4 HANA供应商主数据BP屏幕增强实战:手把手教你给LFA1表加自定义字段
  • 告别杂乱:用AD24的Class管理与规则设置,高效规划你的PCB电源与信号