zoukankan      html  css  js  c++  java
  • Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和

    题目链接

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

    #include<iostream>
    #include<cstdio>
    #include<fstream>
    #include<algorithm>
    #include<string>
    #include<sstream>
    #include<cstring>
        using namespace std;
        int f[2005][2005],s[2005][2005];
    int main()
    {
        int t=0,k=0;
        scanf("%d%d",&t,&k);    
        for(int i=0;i<=2000;i++) f[i][0]=1;//初始化 
        for(int i=1;i<=2000;i++)//构造杨辉三角,因为组合数就是杨辉三角 
            for(int j=1;j<=i;j++)
                f[i][j]=(f[i-1][j]+f[i-1][j-1])%k;//记得取模(如果模成0就代表可以被k整除),不然会爆 
        for(int i=1;i<=2000;i++)//二维前缀和 
            for(int j=1;j<=2000;j++)
            {
                s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//将前面的计算结果挪过来 
                if(f[i][j]==0&&j<=i) s[i][j]++;//如果这个位置的数可以被k整除且这个位置是合法的,那么就加1 
            }
        for(int T=1;T<=t;T++)
        {
            int n=0,m=0;
            scanf("%d%d",&n,&m);
            printf("%d
    ",s[n][m]);//直接输出 
        }
        return 0;
    }
  • 相关阅读:
    DELPHI美化界面
    WebSevice相关
    Hotmail邮件接收
    DHTMLEdit
    Eclipse 基础
    POP3相关
    DELPHI中GIF的使用
    javaaop
    RAD Studio 2010 启动报错"displayNotification: 内存不够" 解决办法
    编程之道
  • 原文地址:https://www.cnblogs.com/wozaixuexi/p/8457398.html
Copyright © 2011-2022 走看看