首页 > 其他分享 >[lnsyoj166/luoguP2822/NOIP2016提高组] 组合数问题

[lnsyoj166/luoguP2822/NOIP2016提高组] 组合数问题

时间:2024-06-16 21:11:16浏览次数:31  
标签:NOIP2016 le frac 组合 int lnsyoj166 luoguP2822 include

题意

原题链接
给定\(n,m,k\),对于所有的\(0\le i \le n,0 \le j \le min\{i,m\}\),有多少对\((i,j)\)满足\(k|(^i_j)\)

sol

在解决组合数问题时,若遇到\(n,m\le2000\)的情况,可以使用递推法(杨辉三角)来进行\(O(n^2)\)的预处理,再\(O(1)\)直接调用

递推法求组合数

\[(^n_m)=(^{n-1}_m)+(^{n-1}_{m-1}) \]

证明:

\[(^{n-1}_m)+(^{n-1}_{m-1}) = \frac{(n-1)!}{m!(n-m-1)!} + \frac{(n-1)!}{(m-1)!(n-m)!} = \frac{n!}{m!(n-m)!} = (^n_m)\]

对于本题,可以在预处理的同时维护二维前缀和,在每次查询时直接查表即可

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 2005;

int n, m, k;
int c[N][N];
int s[N][N];

void init(){
    c[0][0] = 1;
    for (int i = 1; i <= 2000; i ++ ){
        c[i][0] = 1;
        for (int j = 1; j <= 2000; j ++ ){
            if (j <= i){
                c[i][j] = (c[i - 1][j] % k + c[i - 1][j - 1] % k) % k;
                if (c[i][j] == 0) s[i][j] ++;
            }
            s[i][j] = s[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
        }
    }
}

int main(){
    int T;
    scanf("%d%d", &T, &k);
    init();
    while (T -- ){
        scanf("%d%d", &n, &m);
        long long cnt = 0;
        for (int i = 1; i <= n; i ++ ){
            cnt += s[i][min(i, m)] - s[i - 1][min(i, m)];
        }
        printf("%lld\n", cnt);
    }

    return 0;
}

标签:NOIP2016,le,frac,组合,int,lnsyoj166,luoguP2822,include
From: https://www.cnblogs.com/XiaoJuRuoUP/p/18251236/lnsyoj166_luoguP2822

相关文章

  • CSP历年复赛题-P2119 [NOIP2016 普及组] 魔法阵
    原题链接:https://www.luogu.com.cn/problem/P2119题意解读:在一组数里找出所有的Xa,Xb,Xc,Xd的组合,使得满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),Xb-Xa<(Xc-Xb)/3,并统计出每个数作为A,B,C,D出现的次数。解题思路:1、枚举(O(n^4))首先想到的是通过4重循环枚举所有可能的Xa,Xb,Xc,Xd,然后判......
  • CSP历年复赛题-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......
  • CSP历年复赛题-P2010 [NOIP2016 普及组] 回文日期
    原题链接:https://www.luogu.com.cn/problem/P2010题意解读:计算两个日期之间有多少个日期是回文。解题思路:如果通过枚举两个日期之间的所有日期,然后判断回文,则会有几个问题:枚举数据规模在10^7级别,再加上对于日期加一天、判断回文等处理,有可能超时,而且对日期进行加一天、判断回......
  • P2831 [NOIP2016 提高组] 愤怒的小鸟
    思路状压+优化代码#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#include<string.h>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespac......
  • 洛谷之P1563 [NOIP2016 提高组] 玩具谜题
    题目 [NOIP2016提高组]玩具谜题题目背景NOIP2016提高组D1T1 题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这时singer告诉小南一个谜......
  • 洛谷题单指南-线性表-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......
  • P1563 [NOIP2016 提高组] 玩具谜题
    1.题目介绍2.题解2.1模拟思路有一个大坑,题目给你的小人顺序是按逆时针给的,不是顺时针!!!跟顺时针相比掉一下顺序就行。看似一共有四种情况:[0,0],[0,1],[1,0],[1,1],其实可以简化分为两种情况,因为[0,0]和[1,1]都代表你要顺时针数,[1,0],[0,1]都代表你要逆时针数代码#include<b......
  • Luogu P1563 [NOIP2016 提高组] 玩具谜题
    [NOIP2016提高组]玩具谜题\(link\)题目背景NOIP2016提高组D1T1题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 【洛谷 P1909】[NOIP2016 普及组] 买铅笔 题解(打擂台法)
    [NOIP2016普及组]买铅笔题目背景NOIP2016普及组T1题目描述P老师需要去商店买支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装......