题解

乱搞就能过了。

首先我们考虑如何快速判断C(i, j ) | k 是否成立。

由于$k$非常小, 所以可以对$k$分解质因数, 接着预处理出前N个数的阶乘的因数中 $p_i$ 的个数, 然后就可以$O(1)$判断C(i,j)| k

然后用mk[i][j] 记录 C(i, j) | k , 并将它转化为二位前缀和, 每次查询只需要输出mk[ n ][ m ]即可

预处理时间复杂度:$O(NlnN + NM)$

每次查询$O(1)$

代码

 #include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define rd read() const int N = 2e3 + ; int T, k, n, m;
int pri[], cnt[], tot;
int num[N][], mk[N][N]; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} int fpow(int a, int b) {
int re = ;
for(; b; b >>= , a *= a) if(b & ) re *= a;
return re;
} int jud(int x, int y) {
for(int i = ; i <= tot; ++i) {
int re = ;
re += num[x][i];
re -= num[y][i];
re -= num[x - y][i];
if(re < cnt[i]) return ;
}
return ;
} void init() {
int t = k;
for(int i = ; i <= k; ++i) if(t % i == ) {
pri[++tot] = i;
while(t % i == ) cnt[tot]++, t /= i;
}
for(int j = ; j <= tot; ++j)
for(int l = ; ; ++l) {
int p = fpow(pri[j], l);
if(p >= N) break;
for(int i = ; i < N; ++i) num[i][j] += i / p;
}
for(int i = ; i < N; ++i)
for(int j = ; j <= i; ++j) if(jud(i, j)) mk[i][j] = ;
for(int i = ; i < N; ++i)
for(int j = ; j < N; ++j) mk[i][j] += mk[i - ][j];
for(int i = ; i < N; ++i)
for(int j = ; j < N; ++j) mk[i][j] += mk[i][j - ];
} int main()
{
T = rd; k = rd;
init();
for(; T; T--) {
n = rd; m = rd;
printf("%d\n", mk[n][m]);
}
}

Luogu 2822[NOIP2016] 组合数问题 - 数论的更多相关文章

  1. Noip2016组合数(数论)

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

  2. [Noip2016]组合数(数论)

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

  3. CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

    CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...

  4. Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和

    题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...

  5. NOIP2016 组合数问题

    https://www.luogu.org/problem/show?pid=2822 题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以 ...

  6. noip2016组合数问题

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

  7. 2559. [NOIP2016]组合数问题

    [题目描述] [输入格式] 从文件中读入数据. 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, m的意义见[问题描 ...

  8. Luogu P1600[NOIP2016]day1 T2天天爱跑步

    号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 ...

  9. LUOGU P2261 [CQOI2007]余数求和(数论分块)

    传送门 解题思路 数论分块,首先将 \(k\%a\) 变成 \(k-a*\left\lfloor\dfrac{k}{a}\right\rfloor\)形式,那么\(\sum\limits_{i=1}^ ...

随机推荐

  1. 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组

    挑战任务 在计算机中,一张数字图像,可以被看做是一个矩阵或者说数组. 学过线性代数的同学对矩阵肯定不陌生.一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(r ...

  2. 第十章 优先级队列 (xa1)左式堆:结构

  3. codeblocks17.12 不能启动调试器

    调试器需要手动指定. settings->debugger->default->executable path.这里默认空的,需要指定.路径在安装目录下的CodeBlocks\Min ...

  4. 字符串 String 格式化 format

    String str=String.format("Hi,%s", "王力"); 保留两位数的整数: String str=String.format(&quo ...

  5. 通过location对象的某些属性得到一个完整URL的各个部分。

    I’m home. 我回来了. I’m lost. 我迷路了. This way. 这边请. After you. 您先. Bless you! 祝福你! 笔记: http://www.example ...

  6. [Java学习]面向对象-抽象类;接口

    抽象类 语法 public abstract class A{ } 定义 抽象类无法实例化.但抽象类有构造方法,在子类创建对象时用. 抽象类中可以定义抽象方法public abstract void ...

  7. Delphi:Exception输出堆栈信息

    起源: 用习惯了c#之Exception的StackTrace,在程序出异常crash时候能够以其定位出问题的模块及行号,用回Delphi 2009,发现没有这东西. 显然,在编译环境日新月异的今天, ...

  8. 【剑指offer】题目二

    //实现一个函数:把字符串中的每个空格替换成"%20".例如输入"We are happy."则输出"We%20are%20happy." ...

  9. AngularJS——第4章 数据绑定

    第4章 数据绑定 AngularJS是以数据做为驱动的MVC框架,所有模型(Model)里的数据经由控制器(Controller)展示到视图(View)中. 所谓数据绑定指的就是将模型(Model)中 ...

  10. 通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明

    启动Tomcat时报错,通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明,报错如下 1.从报错可以看到找不到元素   tx:annotation-driven ...