题目传送门:https://www.luogu.org/problemnew/show/P2822                 ↓题目大意↓

数据的极限范围:n,m≤2000,k≤21,数据组数≤10000。

由于此题k不大于21,故在计算组合数Cij时,并不需要存储它的真实数值,只需要存储其≤19的所有素因子的个数,判断Cij是否为k的倍数,仅需要判断Cij中各素因子的个数是否大于等于k中的个数即可。基于组合数的性质,我们如果要求出Cij,我们可以通过Ci(j-1)乘上i-j+1然后再除以j即可得到。

下面来考虑如何乘以或除以一个数x。若需要在Ci(j-1)的基础上乘以x,可以考虑将x分解质因数,仅将其≤19的全部素因子与Ci(j-1)的素因子个数进行累加。除法同理,加法改成减法即可。

最后维护一个二维数组b。若b[i][j]=1,则表示Cij是k的倍数。输入n,m时,将b[1..n][1..m]进行累加即可得出答案。很明显这么操作依然会TLE,使用另一数组维护b[i][j]的前缀和即可。

时间复杂度为O(n*m+T)。 但常数很大(本地均为0.3s左右)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#define M 2000
using namespace std;
int p[]={,,,,,,,};
struct cg{
int a[];
cg(){memset(a,,sizeof(a));}
cg(int x){
for(int i=;i<;i++)
while(x%p[i]==) a[i]++,x/=p[i];
}
friend cg operator *(cg a,int x){
for(int i=;i<;i++)
while(x%p[i]==) a.a[i]++,x/=p[i];
return a;
}
friend cg operator /(cg a,int x){
for(int i=;i<;i++)
while(x%p[i]==) a.a[i]--,x/=p[i];
return a;
}
friend bool operator +(cg a,int x){
cg c=a;
for(int i=;i<;i++)
while(x%p[i]==){
c.a[i]--;x/=p[i];
if(c.a[i]<) return ;
}
return ;
}
}a[M+][M+];
int b[M+][M+]={},k; void init(){
for(int i=;i<=M;i++){
int zhi=i>>;
for(int j=;j<=zhi;j++)
a[i][j]=a[i][i-j]=a[i][j-]*(i-j+)/j;
}
for(int i=;i<=M;i++){
int zhi=i>>;
for(int j=;j<=zhi;j++){
b[i][j]=b[i][i-j]=a[i][j]+k;
}
}
for(int i=;i<=M;i++)
for(int j=;j<=M;j++){
b[i][j]=b[i-][j]+b[i][j-]-b[i-][j-]+b[i][j];
}
} int main(){
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
int cas; cin>>cas>>k;
init();
while(cas--){
int x,y; scanf("%d%d",&x,&y);
printf("%d\n",b[x][y]);
}
}

【NOIP2016提高组】 Day2 T1 组合数问题的更多相关文章

  1. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  2. NOIP 2015复赛提高组Day2 T1==Codevs 4768 跳石头

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中 ...

  3. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  4. 【暴力】洛谷 P2038 NOIP2014提高组 day2 T1 无线网络发射器选址

    暴力枚举. #include<cstdio> #include<algorithm> using namespace std; ][],d,n,x,y,z,num,ans=-; ...

  5. Noip2013 提高组 Day2 T1 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  6. 【NOIP2016提高组day2】愤怒的小鸟

    分析 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均 ...

  7. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

  8. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  9. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  10. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

随机推荐

  1. 201521123060《Java程序设计》第2周学习总结

    1. 本周学习总结 a.进一步熟悉了Eclipse的使用和java程序的编写: b.学习了java数据的基本类型:整数类型,浮点类型等: c.学习了算数运算符,赋值运算符,位运算符,关系运算符,逻辑运 ...

  2. 201521123059 《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.关系型数据库 --建立表格时表中一列中的数据类型必须一致.关系表中的行必须是唯一的,列是不可分的,某些行的某 ...

  3. 201521123018 《Java程序设计》第10周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 2. 书面作业 一.inally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答: 4-2中 ...

  4. 201521123079《java程序设计》第13周学习总结

    1. 本周学习总结 1.以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. (1)netassist可以用来链接IP端口 (2)accept方法可以用来监听端口,当没有客户端连接 ...

  5. 多线程面试题系列(2): CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  6. 关于学习Python的一些心得

    1.关注函数参数的类型,如列表,字符串,int,而不是关注函数的功能 2.导入模块numpy,dir(numpy) 查看所有属性 3.''.join(列表)  将列表拆成字符串

  7. phoenix

    phoenix(直译做凤凰)的操作sql是通过jdbc发送到HBase的.phoenix的查询语句会转化为hbase的scan操作和服务器端的过滤器.如果我们手工使用HBase的api去写这些代码,也 ...

  8. Coder的好伙伴Github

    网络越来越发达,各式各样的网盘.云存储也走进日常生活,  在老师的指导下,我第一次接触了GitHub. 什么是Github? Github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一 ...

  9. Day2 基本数据类型

    一.python数据类型 1.1数字 2 是一个整数的例子. 长整数 不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4 ...

  10. Elevator poj3539

    Elevator Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 1072   Accepted: 287 Case Time ...