2021年寒假每日一题,2017~2019年的省赛真题。本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。每日一题,关注蓝桥杯专栏: https://blog.csdn.net/weixin_43914593/category_10721247.html

每题提供C++、Java、Python三种语言的代码。

文章目录

  • 1、题目描述
  • 2、组合数的计算
  • 3、小规模代码
  • 4、lucas定理

2019省赛A组第10题“组合数问题” ,题目链接:
http://oj.ecustacm.cn/problem.php?id=1461
https://www.dotcpp.com/oj/problem2303.html

1、题目描述


给 n , m , k n,m,k n,m,k,求有多少对 ( i , j ) (i,j) (i,j)满足 1 ≤ i ≤ n , 0 ≤ j ≤ m i n ( i , m ) 1 ≤ i ≤ n,0 ≤ j ≤ min(i,m) 1≤i≤n,0≤j≤min(i,m)且 C i j ≡ 0 ( m o d k ) C_i^j ≡ 0(mod \ k) Cij​≡0(mod k), k k k 是质数。其中 C i j C_i^j Cij​是组合数,表示从 i i i个不同的数中选出 j j j 个组成 一个集合的方案数。

输入:第一行两个数 t, k,其中 t 代表该测试点包含 t 组询问,k 的意思与上文中 相同。
接下来 t 行每行两个整数 n, m,表示一组询问。
输出:输出 t 行,每行一个整数表示对应的答案。由于答案可能很大,请输出答 案除以 1 0 9 + 7 10^9 + 7 109+7 的余数。
数据规模
40%: 1 ≤ k ≤ 100 , 1 ≤ t ≤ 1 0 5 , 1 ≤ n , m ≤ 2000 1 ≤ k ≤ 100, 1 ≤ t ≤ 10^5,1 ≤ n,m ≤ 2000 1≤k≤100,1≤t≤105,1≤n,m≤2000
100%: 1 ≤ k ≤ 1 0 8 , 1 ≤ t ≤ 1 0 5 , 1 ≤ n , m ≤ 1 0 18 1 ≤ k ≤ 10^8, 1 ≤ t ≤ 10^5,1 ≤ n,m ≤ 10^{18} 1≤k≤108,1≤t≤105,1≤n,m≤1018


2、组合数的计算

  式子 C i j ≡ 0 ( m o d k ) C_i^j ≡ 0(mod \ k) Cij​≡0(mod k)中符号“ ≡ ≡ ≡”的意思是同余,这个式子的意思是 C i j C_i^j Cij​能整除 k k k。
  同余的概念和题目,参考博文:https://blog.csdn.net/weixin_43914593/article/details/107642766
  组合数的定义是: C i j = i ! j ! × ( i − j ) ! C_i^j =\frac{i!}{j!\times(i-j)!} Cij​=j!×(i−j)!i!​
  有多种计算方法。
  (1)直接按定义算。因为有大数,用Python写代码。例如计算 C 50 20 C_{50}^{20} C5020​,得47129212243960:

temp = 1   #组合数
i,j = 50,20
for p in range(1,i+1): temp *=p     #求i!
print(temp)
for p in range(1,j+1): temp //=p     #除j!
for p in range(1,i-j+1): temp //=p   #再除以(i-j)!
print(int(temp))

https://blog.csdn.net/qq_36477987/article/details/89521273

  直接算是不好的,因为阶乘增长极快,例如 12 ! = 479 , 001 , 600 12!=479,001,600 12!=479,001,600。
(2)按递推式计算: c ( i , j ) = c ( i − 1 , j − 1 ) + c ( i − 1 , j ) c(i,j)=c(i-1,j-1)+c(i-1,j) c(i,j)=c(i−1,j−1)+c(i−1,j)。复杂度 O ( n m ) O(nm) O(nm)。例如计算 C 2000 600 C_{2000}^{600} C2000600​:

c = [[0 for i in range(2001)] for i in range(2001)] #用于记录组合数c[n][m]
Mod = int(1e9+7)
n,m =2000, 600
for i in range(n+1):c[i][0]=1c[i][i]=1
for i in range(1,n+1):    #递推计算所有组合数for j in range(1,m+1):c[i][j]= (c[i-1][j-1]+c[i-1][j])% Mod;
print(c[n][m])

3、小规模代码

   本题有40%的小规模数据, 1 ≤ n , m ≤ 2000 1 ≤ n,m ≤ 2000 1≤n,m≤2000,复杂度 O ( n m ) O(nm) O(nm)够用。下面是C++代码,能得到一点分数。

#include<bits/stdc++.h>
using namespace std;
const int Mod = 1e9+7;
int c[2010][2010];  //记录组合数c[n][m]
int main(){int n,m,t,k;cin >> t >> k;int nn=2000,mm=2000;   //小规模for(int i=0;i<=nn;i++){c[i][0]=1;c[i][i]=1;}for (int i =1;i<=nn;i++)   //打表,提前计算出所有组合数for(int j =1;j<=mm;j++)c[i][j]= (c[i-1][j-1]+c[i-1][j]) % k;  //直接对k取余while(t--){cin >> n >> m;int ans=0;for(int j=0;j<=m;j++)for(int i=j;i<=n;i++)if(c[i][j] == 0)ans++;cout << ans % Mod;}return 0;
}

4、lucas定理

   当 1 ≤ n , m ≤ 1 0 18 1 ≤ n,m ≤ 10^{18} 1≤n,m≤1018时,显然用上面的递推方法计算组合数 C i j C_i^j Cij​是不可能的。
   其实学过数论的队员一看本题,就知道它几乎是一道lucas定理的裸题。lucas定理就是求极大的组合数 C n m C_n^m Cnm​对p取余。
   因为较为复杂,本文不做解析。请参考博文https://www.freesion.com/article/92161191517/

倪文迪陪你学蓝桥杯2021寒假每日一题:2.1日(2019省赛A组第10题)相关推荐

  1. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.26日(2019省赛A组第4题)

    2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...

  2. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.20日(2018省赛A组第8题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  3. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.19日(2018省赛A组第7题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  4. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.15日(2018省赛A组第3题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  5. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.21日(2018省赛A组第9题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  6. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...

  7. 第十三届蓝桥杯省赛B组 第10题(LCDS?找规律.)

    题目 题意: 给定n个数,要求用魔法把n个数全都变成1.魔法:将一段连续区间的数ai变成sqrt(a[i]/2+1) 思路: 一个数最多施展魔法6次即可,可以预处理出每个数变到1的路径.实质是找到两个 ...

  8. 第十二届 2021年1月 蓝桥杯青少年组省赛C++组 第1题--第3题(scratch实现)

    第十二届2021年蓝桥杯青少年组省赛 第十二届2021年蓝桥杯青少年组省赛_lybc2019的博客-CSDN博客 第十二届蓝桥杯青少年组省赛C++中级组试卷讲解(2021.01) 第十二届蓝桥杯青少年 ...

  9. 第十二届蓝桥杯 2021年国赛真题 (Java 大学A组)

    蓝桥杯 2021年国赛真题(Java 大学 A 组 ) #A 纯质数 按序枚举 按位枚举 #B 完全日期 朴素解法 朴素改进 #C 最小权值 动态规划 #D 覆盖 变种八皇后 状压 DP #E 123 ...

最新文章

  1. Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
  2. sublime text使用小技巧
  3. shiro之自定义realm
  4. C# Hook原理及EasyHook简易教程
  5. Java临时缓存API –测试早期草案评审RI
  6. 新零售基础设施 看阿里巴巴如何打“地基”
  7. 终于有人把tomcat讲清楚了。
  8. 我错了——虚拟光驱 for linux
  9. 信息安全原理与技术第八次实验:拒绝服务攻击与防范
  10. AutoCad 批量打印
  11. 清华梦的粉碎—写给清华大学的退学申请(转自王垠Blog)
  12. 接口自动化测试 --- Rest Assured
  13. EtherNet IP /Modbus 网关ENB-302MI
  14. The POODLE attack (SSLv3 supported) 漏洞修复
  15. 奥林匹克计算机竞赛保送,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
  16. java为什么被开发者_Spring为何受到Java开发者的青睐?Spring是如何简化Java开发的?...
  17. 大数据查询引擎 PrestoDB
  18. matlab 类似宏定义,比较全面的宏定义解析
  19. tnl 网络游戏架构底层深入分析
  20. 全志A10平板上的ubuntu终极安装版,支持HDMI和平板本机LCD

热门文章

  1. c#发送微信模板消息
  2. media响应式布局
  3. Android集成谷歌定位sdk,概述-Android 定位SDK | 高德地图API
  4. 计算机底层存储,图引擎底层存储的设计与实现-计算机工程.PDF
  5. oracle 带字符串函数,oracle 字符串操作函数 大全
  6. java给视频添加字幕_JavaCV本地视频流通过帧图片添加文本进行字幕合成
  7. Oracle的并集、交集、差集运算
  8. 软工1816 · 第七次作业 - 需求分析报告
  9. [AcWing算法提高课]之图论 单源最短路的综合应用(C++题解)
  10. 计算机基础办公软件一级,计算机一级计算机基础及 ms office 应用考些什么