传送门啦

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

洛谷P2822组合数问题相关推荐

  1. 洛谷P2822 组合数问题

    分析: 首先预处理出来,杨辉三角+二维前缀和 代码: #include<cstdio> using namespace std; long long f[2005][2005],sum[2 ...

  2. 洛谷P2181答案C语言,洛谷P2181 对角线(组合数)

    题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. 输出格式: 第一行输出交点数 ...

  3. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  4. 【数学1】基础数学问题 - 题单 - 洛谷

    这里写目录标题 [[数学1]基础数学问题 - 题单 - 洛谷](https://www.luogu.com.cn/training/117) [P1143 进制转换](https://www.luog ...

  5. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】

    题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...

  6. 洛谷——P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...

  7. 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)

    洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...

  8. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  9. 洛谷、牛客网、AcWing 刷题(python版)

    牛客网python专项练习整理(一) https://blog.csdn.net/weixin_41913008/article/details/87203468 牛客网剑指offer--python ...

最新文章

  1. 在eclipse中开发servlet流程
  2. 使用mybatis向oracle数据库插入数据异常
  3. NIO这样理解才够深入!
  4. SpikeSource公司的CEO-Kim Polese访谈
  5. RUNOOB python练习题10
  6. 【OpenCV】OpenCV实战从入门到精通之 -- 常用数据结构和函数(Point、Scalar、Size、Rect、cvtColor)
  7. python可以下载百度文库_Python
  8. java 时间转为毫秒数_疫情期间面试总结一(java基础方面)
  9. 利用函数求数组中的最大值
  10. Adversarial learned Inference(对抗学习推断器)
  11. 42、最大子序和(python)
  12. 最新仿7881游戏装备网虚拟物品交易源码+修复版
  13. java读取文件的万能解决方案
  14. PIC单片机汇编指令集合
  15. 表格排版及其表格嵌套
  16. 花都平安保险应该找谁?
  17. 1g等于多少mb计算机网络,1g等于多少mb 硬盘容量详细介绍
  18. 麦克纳姆轮(全向轮)
  19. 修改php-fpm监听端口,php-fpm配置详解
  20. Linux kernel log与调试

热门文章

  1. jQuery中DOM操作方法 之 html,text,val
  2. asp.net 中ashx、axd的区别
  3. 在什么情况下,刘强东会丧失京东的控制权?
  4. AD提高动态的方法(附SNR计算)
  5. 有一种小说叫“纯爱”:为“纯爱小说系列写的序言
  6. U_boot 的 bootcmd 和bootargs参数详解
  7. java io运用_Java IO相关使用
  8. python堆排序求topn_Java堆排序,取得前TopN个数
  9. java中compare语句的用法_Java RuleBasedCollator compare()用法及代码示例
  10. 手机网页转换为html文件,怎么在手机上打开HTML文件