acwing 疑難雜題 組合數問題(數論)

題目

在這裏插入圖片描述

輸入 輸出

在這裏插入圖片描述

思路

一個範圍

在這裏插入圖片描述

求二維 的前綴和

二維前綴和公式

在這裏插入圖片描述

如何快速求一個組合數是否能整除k?

組合數的遞推式

在這裏插入圖片描述

代碼

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

using namespace std;

const  int N = 2010;
int c[N][N];
int s[N][N];  //前綴和

int main()
{
    int T,k;
    cin >>  T >> k;
    
    for(int i = 0; i < N;i++)
        for(int j = 0;j <= i;j++)
        {
            if(!j) c[i][j] = 1 % k;  //i j 全爲0的時候,也就是0個裏面選0個,,答案爲 1
            else c[i][j] = (c[i - 1][j]  + c[i - 1][j - 1])  % k;
        }
    
    for(int i = 0;i < N;i++)
    {
        for(int j = 0;j < N;j++)
        {
            if(j <= i && c[i][j] == 0) s[i][j] = 1;
            if(i - 1 >= 0) s[i][j] += s[i - 1][j];
            if(j - 1 >= 0) s[i][j] += s[i][j - 1];
            if(i - 1 >= 0 && j - 1 >= 0) s[i][j] -= s[i - 1][j - 1];
        }
    }
    while(T--)
    {
        int n,m;
        cin >> n >> m;
        cout  << s[n][m] << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章