洛谷P2822组合数问题

传送门啦

15分暴力,但看题解说暴力分有30分。

就是找到公式,然后套公式。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;long long read(){char ch;bool f = false;while((ch = getchar()) < '0' || ch > '9')if(ch == '-')  f = true;int res = ch - 48;while((ch = getchar()) >= '0' && ch <='9')res = res * 10 - ch + 48;return f ? res + 1 : res; 
}long long jc(long long a){//求阶乘 if(a == 0)  return 1;long long ans = 1;for(int i=1;i<=a;i++)ans *= i;return ans; //b = !a 
} long long C(long long n,long long m){return jc(n) / (jc(m) * jc(n - m));
}
//组合数公式:Cn^m = !n / (!m * !(n - m)) long long t,k,n,m;
long long sum,x;int main(){t = read();  k = read();while(t--){x = 0;n = read();  m = read();//sum = jc(n) / (jc(m) * jc(n - m));for(long long i=1;i<=n;i++){//int j = min(i , m);for(long long j=1;j<=min(i,m);j++){//sum = jc(i) / (jc(j) * jc(i - j));if(C(i,j) % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

组合数证明

15分,我现在用了组合数的递推公式,按理说应该更快了,但。。(想不通,数据范围在那里啊)

c[i][j]即为从i件物品中选j件的方案数。如果第i件物品不选,方案数就变为c[i-1][j],如果选第i件物品,方案数就变为c[i-1][j-1],总方案数就为两种情况的方案数之和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;long long read(){char ch;bool f = false;while((ch = getchar()) < '0' || ch > '9')if(ch == '-')  f = true;int res = ch - 48;while((ch = getchar()) >= '0' && ch <='9')res = res * 10 - ch + 48;return f ? res + 1 : res; 
}long long t,k,n,m;
long long sum,x,C[maxn][maxn];int main(){t = read();  k = read();while(t--){x = 0;C[1][0] = C[1][1] = 1;n = read();  m = read();for(long long i=2;i<=n;i++){C[i][0] = 1;for(long long j=1;j<=min(i,m);j++){C[i][j] = C[i-1][j] + C[i-1][j-1];if(C[i][j] % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

为了提高效率,我们可以进行进一步的优化,就是预处理出组合数从而求出所有区间的满足条件的组合数个数,这里就要用到二维前缀和

杨辉三角

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long t,k,n,m;
long long sum[maxn][maxn],x,C[maxn][maxn];void work(){for(int i=1;i<=2000;i++){C[i][0] = 1;C[i][i] = 1;}C[1][1] = 1;for(long long i=2;i<=2000;i++)for(long long j=1;j<i;j++){C[i][j] = (C[i-1][j] + C[i-1][j-1]) % k;}for(long long i=1;i<=2000;i++){for(long long j=1;j<=i;j++){sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];if(C[i][j] == 0)sum[i][j]++ ;}sum[i][i+1] = sum[i][i]; }
}int main(){memset(C,0,sizeof(C));memset(sum,0,sizeof(sum));t = read();  k = read();work();while(t--){n = read();  m = read();m = min(n , m);printf("%lld\n",sum[n][m]);}return 0;
}

还有一个事不得不说,我改了一下午竟然发现是自己的快读打错了:

修改后:

暴力 40分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long jc(long long a){//求阶乘 if(a == 0)  return 1;long long ans = 1;for(int i=1;i<=a;i++)ans *= i;return ans; //b = !a 
} long long C(long long n,long long m){return jc(n) / (jc(m) * jc(n - m));
}
//组合数公式:Cn^m = !n / (!m * !(n - m)) long long t,k,n,m;
long long sum,x;int main(){t = read();  k = read();while(t--){x = 0;n = read();  m = read();//sum = jc(n) / (jc(m) * jc(n - m));for(long long i=1;i<=n;i++){//int j = min(i , m);for(long long j=1;j<=min(i,m);j++){//sum = jc(i) / (jc(j) * jc(i - j));if(C(i,j) % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

递推公式 70

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2005;inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}long long t,k,n,m;
long long sum,x,C[maxn][maxn];int main(){t = read();  k = read();while(t--){x = 0;C[1][0] = C[1][1] = 1;n = read();  m = read();for(long long i=2;i<=n;i++){C[i][0] = 1;for(long long j=1;j<=min(i,m);j++){C[i][j] = C[i-1][j] + C[i-1][j-1];if(C[i][j] % k == 0)x++;}}printf("%lld\n",x);}return 0;
}

转载于:https://www.cnblogs.com/Stephen-F/p/9884660.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Docker的GoldenGate部署

前言Docker最近几年异常火爆&#xff0c;主要是因为其方便、快捷、轻量&#xff0c;相对于VM&#xff0c;它不需要占用太多资源&#xff0c;随时可以创建、删除&#xff0c;或在已有image上添加一些软件&#xff0c;再制作成另一个模板image供日后使用。Docker提供的Hub或priva…

javascript --- 防抖与节流

说明 源码 1. 防抖与节流 1.1 防抖 防抖: 触发事件后,在n秒内函数只执行一次 记忆: 你手比较抖,不小心按了按钮2下…你只希望它只执行一次.且按第二次结束时间算…这就用到了防抖技术 1.2 节流 节流: 连续发生的事件,在n秒内只执行一次函数 1.3 防抖与节流的区别 在一段…

bugku_本地包含

先上payload: 1、?hello);show_source(%27flag.php%27);// 2、?hello);include $_POST[zzz];// POST传参:zzzphp://filter/readconvert.base64-encode/resourceflag.php 3、?hellofile(%27flag.php%27) 4、?helloshow_source(flag.php) 首先我们来看源码&#xff1a; <?…

javascript --- js中的作用域 变量提升

1 求以下函数的输出 1.1 考察点: 变量提升、this、作用域 // 考察点 作用域、this、变量提升 var a 10 function test() {a 100console.log(a) console.log(this.a) var aconsole.log(a) } test()第一个和第三个肯定是100在node环境下,没有window的概念,因此输出的是 und…

洛谷1091合唱队形

题目描述 N位同学站成一排&#xff0c;音乐老师要请其中的(N−K)位同学出列&#xff0c;使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设K位同学从左到右依次编号为1,2,…,K&#xff0c;他们的身高分别为T1​,T2​,…,TK​&#xff0c; 则他们的身高…

poj3069 Saruman's Army(贪心)

https://vjudge.net/problem/POJ-3069 弄清楚一点&#xff0c;第一个stone的位置&#xff0c;考虑左右两边都要覆盖R&#xff0c;所以一般情况下不会在左边第一个&#xff08;除非前两个相距>R&#xff09;。 一开始二层循环外层写的i1&#xff0c;这样对于数据诸如1 1 1>…

Redis的key和value大小限制

Redis的key和value大小限制今天研究了下将java bean序列化到redis中存储起来&#xff0c;突然脑袋灵光一闪&#xff0c;对象大小会不会超过redis限制&#xff1f;不管怎么着&#xff0c;还是搞清楚一下比较好&#xff0c;所以就去问了下百度&#xff0c;果然没多少人关心这个问…

jquery --- 监听tab栏的变化

1. jQuery样式操作 1.1 操作css方法 参数只写属性名,则返回属性值(字符串) $(this).css(color)参数是 属性名、属性值(逗号分隔&#xff0c;则表示设置属性 $(this).css(color,red)参数可以是对象的形式 $(this).css({width: 400px,height: 400px })1.2 设置类样式方法 添…

bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

bzoj题面什么鬼啊…… 题目大意&#xff1a;有一个初始值均为0的数列&#xff0c;n次操作&#xff0c;每次将数列(ai,bi-1)这个区间中的数与ci取max&#xff0c;问n次后元素和 离散化&#xff0c;然后建立线段树&#xff0c;每次修改在区间上打max标记即可 #include<iostrea…

Redis单机和集群环境搭建

一、安装单机版redis 1、可以自己去官网下载&#xff0c;当然也可以用课程提供的压缩包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-src.tar.gz # cd /usr/local/tcl8.6.1/unix/ # ./configure # make &…

yum离线安装

安装yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly下载对应的软件包&#xff0c;我们以mysql为例&#xff0c;终端输入如下命令 yum install -y --downloadonly --downloaddir/soft/mysql mysql --downloaddir用来指定下载的路径转载于:https://www.cnb…

算法 --- 递归实现多级树展开结构

说明 先根据数据渲染,然后再实现事件 渲染 在项目中,经常会给出一个深度不确定的数组,数字结构如下: data [{name: a, child:[{name: a1},{name: a2, child: [{name:a21}]}]},{name: b} ]要求将数组渲染成对应的目录结构, 结构如下: <ul><li>a<ul><…

PYTHON自动化Day4-交换变量,字符串方法,拷贝,集合,文件,文件指针

一.判断 # 非空即真、非0即真 # 不为空的话就是true&#xff0c;是空的话就是false # 只要不是0就是true&#xff0c;是0就是false# 布尔类型 # True False name input(请输入你的名字&#xff1a;).strip() a [] #false d{} # false c 0 #false f tuple() #false e #fa…

Ajax-jsonp

一、什么是Jsonp jsonp(json with padding) 是一种“使用模式”&#xff0c;可以让网页从别的域名那获取资料&#xff0c;即跨域读取数据。 为什么会使用jsonp呢&#xff1f;因为同源策略&#xff08;数据来源一致&#xff09;&#xff0c;现在所有支持javascript 的浏览器都会…

javascript --- [读书笔记] 回流与重绘 前端优化小结

1. 浏览器渲染原理 请说出: 从用户在浏览器地址输入网址,到看整个页面,中间都发生了哪些事情? HTTP请求阶段HTTP响应阶段浏览器渲染阶段 1.1 可能用到的知识 1.1.1 进程 Process、线程 Thread、 栈内存 Stack 进程: 就是开的每一个程序: QQ、网易云音乐、Typora、VSCode……

ARP协议,以及ARP欺骗

1.定义&#xff1a; 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此…

css --- [小结]让盒子水平垂直居中的解决方案

描述 有如下模型,想办法让 <style>.box{width: 500px;height: 500px;background: skyblue;} </style> <div class"box"><div class"inner"></div> </div>想办法让inner在box中水平垂直居中 方案1: 使用绝对定位 让…

数组洗牌 Fisher Yates

看播放器代码时发现的这个洗牌算法&#xff0c;再网上查了一番 作用是把数组变成随机序列&#xff0c;原理类似于从牌堆A中随机抽牌放进牌堆B 代码1&#xff1a; 返回一个由&#xff08;数组下标&#xff09;组成的数组 function random(length) {function shuffle (arr) {for…

一个不错的MYSQL数据库备份类,PHP版,一个文件,精简版

1 <?php2 class DbManage {3 var $db; // 数据库连接4 var $database; // 所用数据库5 var $sqldir; // 数据库备份文件夹6 // 换行符7 private $ds "\n";8 // 存储SQL的变量9 public $sqlContent "";10 // 每条sql…

javascript --- 堆栈内存与闭包的作用

你可能会用到的 堆内存: 存储引用类型值所在的空间栈内存: 存储基本类型值和存储代码所在空间函数上下文: JS每一个函数在执行的时候都会创建一个执行上下文 1. 堆内存中的数字和字符串都是相等的 let a {}, b0, c0; a[b] marron; a[c] Mar console.log(a[b]) // Mar第一…