zoukankan      html  css  js  c++  java
  • Uva11538 排列组合水题

    画个图就很容易推出公式:

    设mn=min(m,n),mx=max(m,n)

    对角线上:

    横向:m*C(n,2)

    纵向:n*C(m,2)

    因为所有的C函数都是只拿了两个,所以可以优化下。不过不优化也过了= =

     1 #include <iostream>
     2 using namespace std;
     3 #define LL long long
     4 int n,m;
     5 
     6 LL P(long n,long m)
     7 {
     8   long p=1;
     9   while(m!=0)
    10   {
    11     p*=n;
    12     n--;
    13     m--;
    14   }
    15   return p;
    16 }
    17 
    18 LL C(long n,long m)
    19 {
    20   long i,c=1;
    21   i=m;
    22   while(i!=0)
    23   {
    24     c*=n;
    25     n--;
    26     i--;
    27   }
    28   while(m!=0)
    29   {
    30     c/=m;
    31     m--;
    32   }
    33   return c;
    34 }
    35 
    36 
    37 int main()
    38 {
    39     while (cin>>n>>m)
    40     {
    41         if ((n==0)&&(m==0))     break;
    42         int mn=min(n,m),mx=max(n,m);
    43         LL sum=0;
    44         for (int i=2;i<=mn;i++)
    45             sum+=C(i,2);
    46         if (mx>2) sum=sum*2;
    47         if (mx-mn-1>0) sum+=(mx-mn-1)*C(mn,2);
    48         sum=sum*2;
    49 
    50         sum+=m*C(n,2)+n*C(m,2);
    51 
    52         sum=sum*2;
    53         cout<<sum<<endl;
    54     }
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    HDU2767 Proving Equivalences
    POJ2771 Guardian of Decency
    POJ1111 Image Perimeters
    简单就好
    工具乃思维的奴隶
    “年终奖”
    学点经济学知识(二)
    被忽略的技能
    猿类己见
    学点经济学知识(一)
  • 原文地址:https://www.cnblogs.com/pdev/p/4104453.html
Copyright © 2011-2022 走看看