首页 > 其他分享 >poj-2249

poj-2249

时间:2023-05-23 16:01:35浏览次数:32  
标签:int long ++ poj 2249 printf 356K cnm


// 356K 16MS    G++
// 356K 0MS G++ add m ==0 check
// 356K 16MS    G++
// 356K 0MS G++ add m ==0 check
#include <stdio.h>
#include <string.h>
#include <math.h>


int m;
int n;


// void getNum(unsigned int n, unsigned int m) {  
//     // long long total = n;  
//     m = m < (n -m) ? m : (n -m);
//     if (m == 0) {
//         printf("1\n");
//         return;
//     }
//     long long cnm = 1;  
//     for (long i = 1; i <=m ; i++) {
//         cnm = cnm*(n-i+1)/i;
//     }


//     printf("%lld\n", cnm);  
// }  
  
void getNum(unsigned int n, unsigned int m) {  
    if (m == 0 || m == n) {
        printf("1\n");
        return;
    }
    m = m < (n -m) ? m : (n -m);  
    
    double cnm = 1.0;  
    while(m>0)  
        cnm *= (double)(n--)/(double)(m--);  
    cnm+=0.5;  
    printf("%lld\n", (long long)cnm);  
}  


int main() {  
    while(scanf("%d %d", &n, &m) != EOF) {  
        if (!m && !n) {  
            return 0;  
        } else if (!n) {  
            printf("0\n");  
        } else if (!m) {
            printf("1\n");  
        } else{  
            getNum(n, m);  
        }  
    }  
}

要说算是道水题, 重点考察:

C(n,m) = C(n,m-1) * (n-m+1) / m.

C(n,m) = C(n,n-m).

尤其是第二个公式, 如果不做这个检测(取m 和 n-m中最小的 来求组合数),铁定TLE,题目的测试数据也应该都是这种类型的, n-m 或 m中会有一个很小的数,使得运算量不会很大(题目很贴心的说了结果

 it will be less than 2

31) , 一开始还以为是道超级水题,直接把二维数组递推求组合搞上去,结果果真RE,然后使用之前用过的组合优化求法, 以及 上面的公式(分别对应code里两个getNum()), 都得到了0ms的结果


标签:int,long,++,poj,2249,printf,356K,cnm
From: https://blog.51cto.com/u_9420214/6332994

相关文章

  • poj-1037
    //196K16MSC++#include<cstdio>#include<cstring>usingnamespacestd;constintMAX=25;longlongDP[MAX][MAX][2];//0:down.1:upvoidinit(){for(intcurPlankNum=1;curPlankNum<=20;curPlankNum++){for(......
  • poj-2140
    //132K 110MS C++#include<cstring>#include<cstdio>usingnamespacestd;intN;longlongcnt;voidsolve(intN){ intbegin=1; intend=1; longlongsum=1; while(1){ if(begin>N){ break; } //if(begin==......
  • poj-1988
    //564K 282MS C++#include<cstdio>#include<cstring>#include<iostream>usingnamespacestd;structUF_Node{ intup; intcount; intparent;};typedefstructUF_NodeUF_Node;UF_NodeUF_Array[30001];voidcreat(){ intc; for(......
  • poj-1693
    //136K 0MS C++#include<cstdio>#include<cstring>structLine{ intbx,ex; intby,ey;};typedefstructLineLine;LinehLine[110];LinevLine[110];intcaseNum;intLineNum;boolinsect(Line&vline,Line&hline){ //pr......
  • POJ1737 Connected Graph ( n点无向连通图计数
    题意说明:求\(n\)个点的无向连通图个数据说已经非常典了,但是我太菜了不会组合数学,最近补档时看到这道题,决定记录下来理理思路......
  • POJ--1163 The Triangle(DP)
    记录10:432023-5-15http://poj.org/problem?id=1163reference:《挑战程序设计竞赛(第2版)》第二章练习题索引p135DescriptionFigure1showsanumbertriangle.Writeaprogramthatcalculatesthehighestsumofnumberspassedonaroutethatstartsatthetopa......
  • 实验六-Salt本地pojie实验
    【实验目的】了解Salt型密码的加密机制,学会使用本地密码pojie工具来pojieSalt型密码,了解pojie密码原理。【知识点】Salt,密码pojie【实验原理】1.Salt概念在密码保护技术中,salt是用来修改口令散列的随机数据串。可将salt加入散列,即使系统的另一用户也选用了同一口令,也可通过唯......
  • POJ 动态规划题目列表
    声明:1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目。※最近更新:Poj斜率优化题目1180,2018,3709列表一:经典题目题号:容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458......
  • poj018(2)
    再贴一版poj1018,其实与之前的那一版差不多,只是去掉了注释,这样可能看起来会舒服一点packagecom.njupt.acm;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.Arrays;importjava.util.Scanner;publicclassTestPOJ1018{pu......
  • poj1018(1)
    其实这道题我也没有完全的弄明白,糊里糊涂就ac了 大致题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths和价格prices。现在每种设备都各需要1个,考虑......