题目传送门: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. 201521123012 《Java程序设计》第二周学习总结

    1. 本章学习总结 1.Java中String和StringBuilder的区别. 2.Arrays()的用法. 2.课后作业 1.使用Eclipse关联jdk源代码(截图),并查看String对象的 ...

  2. 201521123085 《Java程序设计》第一周学习总结

    一 本周学习总结 学习了Java,又和老师见面了,这学期要好好学习Java了.Java这个东西刚刚接触很难懂,其实现在还是不懂,但是我会慢慢地努力地好好学,上机课第一次在黑色的框框弄出Hello wo ...

  3. 201521123093 java 第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  4. JAVA课程设计——单机版五子棋

    JAVA课程设计--单机版五子棋 1.团队名称.团队成员介绍 团队名称:Gomoku小分队 团队成员: 网络1512 201521123038 游舒婷(组长) 网络1512 201521123043 ...

  5. 笔记3 linux 多线程 条件变量+互斥锁

    //cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { ...

  6. 01快速入门-04-Map、Set和iterable(ES6)

    1.Map 我们知道,在JS中其实对象的方式就跟Java中的Map极为相似,即键值对的方式.JS中,key必须是字符串,实际上Number等值作为key也是合理的,所以为了解决这个问题,在最新的ES6 ...

  7. Linux 命令练习

     ls命令 ls就是list的简写,目的是打印当前目录下的清单 格式 ls[选项][目录名] 常用参数 -a –all 列出目录下的所有文件,包括以 . 开头的隐含文件 -l 除了文件名之外,还将文件 ...

  8. 【BBED】BBED模拟并修复ORA-08102错误

    [BBED]BBED模拟并修复ORA-08102错误 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  9. MySql Jar 包下载

    MySql JAR 包下载 我们要使用Spring 链接MySql  需要两个Jar 包   一个是C3p0   一个是MySql 的Connection Jar  包 C3p0: 进入下面的网址 h ...

  10. [转]iOS 应用程序的生命周期

    OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...