/********************************************************************************
很好的组合数学题,跟数论结合,Lucas定理的应用,关键是这个转化:
C(n, k) % p = C(n % p, k % p) * C(n / p, k / p) % p
C(n, k) % p = n! / (k! * (n - k)!) % p = n! * (k! * (n - k)!)^-1 % p
现在要求(k! * (n - k)!) % p的逆元,因为k!*(n - k)!不可能包含素因子p,所以逆元必然存在。
注意求得的逆元可能小于0!
然后dfs下就完事,但是因为每次求阶乘显然会超时,所以事先打表处理~(PS:此段出处Racebug)
切数论题还是要小心。。。整数域跟素数域都很容易坑爹的~
********************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cstdio>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
//typedef long long LL;
typedef __int64 LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef map<int, int>::iterator MI;
typedef vector<int>::iterator VI;
typedef set<int>::iterator SI;
const int INF_INT = 0x3f3f3f3f;
const double oo = 10e9;
const double eps = 10e-7;
const double PI = acos(-1.0);
const int MAXN = 10004;
int pcnt, prm[MAXN], dp[1500][MAXN];
bool is[MAXN];
inline bool scan_d(int &num)
{
char in;
in = getchar();
if(EOF == in)
{
return false;
}
while(in < '0' || in > '9')
{
in = getchar();
}
num = in - '0';
while(in = getchar(), in >= '0' && in <= '9')
{
num *= 10, num += in - '0';
}
return true;
}
void preprocess()
{
pcnt = 0;
memset(is, true, sizeof(is));
is[0] = is[1] = false;
prm[pcnt++] = 2;
for (int i = 4; i < MAXN; i += 2)
{
is[i] = false;
}
int ind;
for (ind = 3; ind * ind <= MAXN; ind += 2)
{
if (is[ind])
{
prm[pcnt++] = ind;
for (int j = ind * ind, k = ind * 2; j < MAXN; j += k)
{
is[j] = false;
}
}
}
while (ind < MAXN)
{
if (is[ind])
{
prm[pcnt++] = ind;
}
ind += 2;
}
for (int i = 0; i < pcnt; ++i)
{
dp[i][0] = 1;
for (int j = 1; j < MAXN; ++j)
{
dp[i][j] = (dp[i][j - 1] * j) % prm[i];
}
}
return ;
}
int ext_gcd(int a, int b, int &x, int &y)
{
if (0 == b)
{
x = 1;
y = 0;
return a;
}
int d = ext_gcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return d;
}
int bisearch(int p)
{
int low = 0, high = pcnt - 1, mid = (low + high) >> 1;
int res = mid;
while (low <= high)
{
mid = (low + high) >> 1;
if (p == prm[mid])
{
res = mid;
break ;
}
if (p < prm[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return res;
}
int Lucas_dfs(int n, int k, int id)
{
int p = prm[id];
int _n, _k, buf, tmp, _tmp, y;
_n = n / p;
_k = k / p;
n %= p;
k %= p;
if (n < k || _n < _k)
{
return 0;
}
tmp = (dp[id][k] * dp[id][n - k]) % p;
ext_gcd(tmp, p, _tmp, y);
if (_tmp < 0)
{
_tmp += p;
}
buf = (dp[id][n] * _tmp) % p;
if (0 == _n && 0 == _k)
{
return buf;
}
return buf * Lucas_dfs(_n, _k, id);
}
void ace()
{
int cas = 0;
int n, k, p;
int id;
while (scan_d(n))
{
scan_d(k);
scan_d(p);
if (k > n - k)
{
k = n - k;
}
id = bisearch(p);
printf("Case #%d: %d\n", ++cas, (Lucas_dfs(n + 1, k, id) + n - k) % p);
}
return ;
}
int main()
{
preprocess();
ace();
return 0;
}相关推荐
PL/SQL 中的数据导入和导出:CSV 文件格式详解
在 PL/SQL 开发中,数据的导入和导出是常见的操作。本文将深入探讨如何使用 PL/SQL 导入和导出 CSV 文件格式的数据,帮助你轻松地实现数据迁移、备份和数据交换等需求。CSV(Comma-Separated Values)是一种常见的文本文件格式,它以逗号作为字段的分隔符,每行表示一个记录。使用 CSV 格式可以方便地在不同的系统之间共享和传输数据。下面我们将分步介绍如何在 PL/SQL 中导入和导出 CSV 文件格式的数据。
数据结构:寻找第k小的数
寻找第k小的数 给定若干整数,请设计一个高效的算法,确定第k小的数。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第1行输入2个整数n,k(1≤k≤n≤1000000)。 第2行输入n个整数,每个数据的取值范围在0到1000000之间。 输出格式: 对于每组测试,输出第k小的数。 输入样例: 5 3 1 2 2 2 1 9 3 1 2 3 4 5 6 9 8 7 输出样例: 2 3 提示: 需要设计的是高效的算法! 可以使用STL之sort、nth_element函数求解。 另外,由于输入数
无人机基本组成部件
无人机基本组成部件
输入输出加速外挂
输入: void scan_d(int &num) { char in; bool neg=false; while(((in=getchar()) > '9' || in<'0') && in!='-') ; if(in=='-'){ neg=true; while((in=getchar()) >'9' || in<'0');
量化爬虫实战:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向思路与Cookie Hook技巧)
本文详细解析了如何通过JS逆向技术获取同花顺问财平台的`hexin-v`参数,包括Cookie Hook技巧和完整解决方案架构。从环境搭建到参数定位,再到生成逻辑逆向,手把手教你突破数据获取限制,为量化交易提供可靠数据支持。
红外气体检测方案解析:从NDIR原理到物联网终端设计实践
气体检测是工业安全与环境监测的核心需求,其技术原理主要基于气体分子对特定物理或化学信号的响应。非色散红外(NDIR)技术作为一种物理检测方法,通过测量气体分子对特定波长红外光的吸收来定量浓度,因其不依赖化学反应,具备寿命长、抗干扰强和响应快等优势。在工程实践中,红外气体检测方案的价值在于为物联网终端设备提供了高可靠、低功耗的感知能力,广泛应用于工业过程监控、环境空气质量监测以及智能家居安全预警等场景。本文以一套集成了Microchip MCU、Axetris红外光源和Pyreos热释电传感器的参考设计为例,
CodeForces - 1182D
题意:找到一个点作根,使同一深度的点有相同数目的边。 思路:经过简单的观察,实际上这样的树有一个特征:当某一个点作根符合题目要求时,每个相同深度的节点其子树的节点数目是相同的,或者是每个相同深度的节点作根,其子树结构相同。 那么答案只有两种情况,一种是叶子,一种是某个点(唯一一个),其每一个所连接的子树的节点数目相等。 因此面对判断一个点是否是答案的难题,可以比较每个节点作根时其子树节...
DataGridView 右键菜单复制(公共)
dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {
快速排序
#include <iostream> using namespace std; void scan_d(int &num) { char in; in=getchar(); while(in<'0'||in>'9') in=getchar(); num=in-'0'; w...
华为手环实时心率数据导出到UWP项目中
hello大家好呀O(∩_∩)O最近在做毕设 其中有个小功能要用到实时心率数据。查找网上的资料发现只有小米手环的实时心率数据导出但是没有华为手环的,我试了华为手环但是并不能行得通哈哈哈。现在分享一下华为手环实时心率数据导出的代码。
《用 AI 赋能医药科研创新》目录(持续更新)
本专栏旨在指导医学科研和药物研发人员运用AI技术提升研究效率。内容包括:利用AI分析文献、识别研究热点、自动生成研究草稿;在新药研发中,通过AI优化临床方案设计、受试者筛选等环节;介绍AI理论基础如大语言模型、提示词工程学及智能体技术发展历程。专栏采用5000-9000字的长文形式,系统讲解AI在医药研发各环节的应用方法,帮助研究者缩短周期、降低成本,推动医药研发进入智能化新阶段。
快速输入(开挂)
inline bool scan_d(int &num) { char in;bool IsN=false; in=getchar(); if(in==EOF) return false; while(in!='-'&&(in<'0'||in>'9')) in=getchar...
深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码
接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。
hdu 3944 DP? 组合数学与数论的结合
原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=3944 题目大意:求杨辉三角中从塔尖到n行k列所经过的路径中,虽经过数字之和最小的一条路 经过观察,很容易想到的一个结论就是,这个最小值是从定点开始,然后到合适的位置45度斜着走到(n,k)的位置,也就是 //c(m,n) 表示n中选m个 c(0,n-k)+c(1,n-k+1)+c(2,n-k+
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
hdu 3944 组合数学
哎,之前组合数学简直是弱的不能再差了。。从这道题中学到好多。。。 这题题意很简单,就是找一条如题意所说的路径,使数的总和最小,然后结果模一个素数。。要想找最小的方案,贪心即可,这里略掉。当k>n/2时,k=k-n/2,这样答案不会变。所以方案是SUM=n-k+C(n,k)+C(n-1,k-1)+...+C(n-k+1,0)。在由公式C(n,k)=C(n-1,k-1)+C(n-1,k)化简成SUM
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
hdu 3944 DP? (预处理+卢卡斯定理)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3944 题目大意: 给一个杨辉三角。然后给出行n和列m,问从第n行第m列往上走到顶部,所得的值的取模p后最小的和。 范围: n,m 思路; 很容易想到肯定是往边上走,然后一直往上走。因为边上都是1,而m>=n/2的时候,明显可以对称到左边来,所以只要算一边就好了。 然后就是组合数的
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
hdu3944
hdu3944题目中给出的杨辉三角形的形状带有误导目的,应该转化成对称的形状再去思考这个问题分两种情况第一个是在左区从目标位置向左上方走一直走到边界,然后再向右上方一直走到起点n-k个1加上C(n-k,0)+C(n-k+1,1)+C(n-k+2,2)+...+C(n,k)C(n-k,0)+C(n-k+1,1)+C(n-k+2,2)+...+C(n,k),又因为C(n-k+1,0)==C(...
hdu 3944 Lucas定理--大组合数取模 多校赛
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3944 只需两步:1、从杨辉三角推公式,汗一下,高中会这个,但是大学只学了高数没学组合数学,于是呵呵了~~~~不会推导的话,看看这个http://blog.youkuaiyun.com/xieshimao/article/details/6699805 2、再谈Lucas定理,看我的另一篇博客吧(随后奉上)
HDU 3944解题报告
DP? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 128000/128000 K (Java/Others) Total Submission(s): 2204 Accepted Submission(s): 705 Problem Description Figure 1 shows t
hdu3944(Lucas定理+预处理)
hdu3944(Lucas定理+预处理) 分类: 数论2013-03-24 14:32 66人阅读 评论(0) 收藏 举报 题目:DP? 对于本题,由于访问的次数很大,所以当然得先预处理保存在数组中,然后用的时候就不用一次一次的再重复计算了,本题重在预处理。 [cpp] view plaincopy #includ
hdu 3944 lucas
需要分情况讨论。 然后求组合数 套上lucas。 #include using namespace std; typedef long long ll; ll n, k, p; ll powmod(ll a, ll b){ ll res = 1; a %= p; while(b){ if(b&1) res = res*a%p; b>>=1; a = a*a%p; } return
【组合数】ZOJ3557 HDU3944
大佬博客: http://blog.youkuaiyun.com/acdreamers/article/details/8037918 /* ZOJ 3557 题意: 从n个数中取m个数 并且这m个数字之间不能相邻 思路: n-m个数不取,留下n-m+1个空 将这m个数插入n-m+1个空中 所以C(n-m+1,m) */ #include using namespace std; typedef lo
HDU 3944-DP?(Lucas定理+预处理)
题目地址:HDU 3944 题意:告诉你在一个在杨辉三角中的点(第n行m列),问你从(0,0)点走到该点经过的点最少的权值和(只能向下走或斜着走)。同时对素数p取余 思路:根据已知的那个点(n,m),如果 n/2 >= m ,那么从已知点出发,可以一直往斜的方向走,直到边界,那么 权值和就为 C(n,m)+C(n-1,m-1)……. 然后由组合数的公式两两合并可以得到 C(n+1,m)+(n-m
lucas数论定理学习
2015ICPC长春网络赛1010 考到了lucas+crt(中国剩余定理) 赛后补题ing。。 卢卡斯定理的百度百科 证明来自一本《初等数论》非常赞! hdu3037 模板题 #include #include #include #include #include #include #include #include #include //#includ
[HDU3944]DP? (组合数学Lucas定理)
题目描述传送门 题意:求在杨辉三角中从(0,0)走到(n,m)路上权值最小的方案%p的值。p为质数。题解杨辉三角是对称的,所以我们只考虑目标点在对称轴左边的情况 观察杨辉三角,可以发现一定是顺着一些1往下走然后斜着走到目标点 即Cmn+Cm−1n−1+Cm−2n−2+...+C1n−m+1+Cn−m,0+n−mC_n^m+C_{n-1}^{m-1}+C_{n-2}^{m-2}+...+C_{n
hdu 3944 数学组合+帕斯卡定理
Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,…and the column from left to right 0,1,2,….If using C(n,k) represents the number of row n, column k. The Yang Hui Triang
8837



被折叠的 条评论
为什么被折叠?



