博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip 2016 Day T1 组合数
阅读量:5014 次
发布时间:2019-06-12

本文共 1518 字,大约阅读时间需要 5 分钟。

 

题目描述

组合数C_n^mCnm​​表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

C_n^m=\frac{n!}{m!(n - m)!}Cnm​​=m!(nm)!n!​​

其中n! = 1 × 2 × · · · × n

小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足C_i^jCij​​是k的倍数。

输入输出格式

输入格式:

 

第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据,k的意义见 【问题描述】。

接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。

 

输出格式:

 

t行,每行一个整数代表答案。

这道题可以暴力50(分数约分)

但如果细心观察结果

可观杨辉三角

1.当m>n时多余的m无意义

2.当m=n时m可看作n

3.当m<n时只取到min(m,i)

例如

m=2,n=4

1

1 1

1 2 1

m=2,n=2;

1 1

1 2 1

m=2,n=1;

1 1

1 2

由杨辉三角递推公式可预处理所有的组合数结果

因而处理时边处理便取摸

但单词询问如果每次都找一遍就炸天了

所以我们要用到一个神奇的东西前缀和

(orz zzy 我只写了一个o(n)查询他写了一个o(1)查询的)

#include
#include
using namespace std;int n,m;int f[2005][2005];int sum[2005][2005];int T,k;int main(){ cin>>T>>k; f[0][0]=1; for(int i=1;i<=2000;i++) { for(int j=1;j<=i;j++) { f[i][j]=(f[i-1][j-1]+f[i-1][j])%k; sum[i][j]=sum[i][j-1]; if(f[i][j]==0)sum[i][j]++; } }// cin>>n;// for(int i=1;i<=n+1;i++)// {// for(int j=1;j<=i;j++)// cout<
<<' ';// cout<
0) { T--; scanf("%d%d",&n,&m); int ans=0; for(int i=1;i<=n+1;i++) ans+=sum[i][min(i,m+1)]; printf("%d\n",ans); } }////orz%%%%%%%%zzy for(int i=1;i

 

转载于:https://www.cnblogs.com/KVMX/p/7350667.html

你可能感兴趣的文章
SQL SERVER BOOK
查看>>
JS基础回顾,小练习(判断数组,以及函数)
查看>>
多任务——进程
查看>>
WCF:如何将net.tcp协议寄宿到IIS
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
php_soap扩展应用
查看>>
第二百三十一节,Bootstrap 介绍
查看>>
vi/vim 三种模式的操作
查看>>
JAVA面向对象三大特性总结
查看>>
guid
查看>>
Python中出现“TabError: inconsistent use of tabs and spaces in indentation”问题的解决
查看>>
ajax请求
查看>>
js学习总结----DOM增删改和应用
查看>>
希尔伯特矩阵(Hilbert matrix)
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>