zoukankan      html  css  js  c++  java
  • luoguP3799 妖梦拼木棒 [组合数学]

    题目背景

    上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。

    题目描述

    有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法?

    输入输出格式

    输入格式:

    第一行一个整数n

    第二行n个整数,a1,a2,……an(0<ai<=5000),代表每根木棒的长度。

    输出格式:

    一行一个整数,对1e9+7取模

    输入输出样例

    输入样例#1:
    4 1 1 2 2
    输出样例#1:
    1

    说明

    对于30%的数据 N<=5000

    对于100%的数据 N<=100000


    木棍长度可以用桶存储

    考虑枚举长木棍l1和短木棍l2,三角形由两种长度的木棍(l1,l1,l2,l2)或三种长度(l1,l1,l2,(l1-l2))的木棍拼成。

    组合数学!

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 typedef long long ll;
     7 
     8 const int maxsiz=5005;
     9 const int mod=1e9+7;
    10 
    11 int n;
    12 int buc[maxsiz];
    13 ll ans;
    14 
    15 int C1(int x){
    16     return x;
    17 }
    18 
    19 int C2(int x){
    20     return 1ll*x*(x-1)/2%mod;
    21 }
    22 
    23 int main(){
    24     scanf("%d",&n);
    25     for(int i=0,tmp;i<n;i++){
    26         scanf("%d",&tmp);
    27         buc[tmp]++;
    28     }
    29     for(int i=2;i<=5000;i++){
    30         if(buc[i]>=2)
    31         for(int j=1;j<=i/2;j++){
    32             int k=i-j;
    33             if(k==j){
    34                 if(buc[j]>=2)
    35                     ans=(1ll*C2(buc[i])*C2(buc[j])%mod+ans)%mod;
    36             }
    37             else{
    38                 if(buc[j]&&buc[k])
    39                     ans=(1ll*C2(buc[i])*C1(buc[j])*C1(buc[k])%mod+ans)%mod;
    40             }
    41         }
    42     }
    43     printf("%d
    ",ans);
    44     return 0;
    45 }
  • 相关阅读:
    10分钟学会理解和解决MySQL乱码问题
    C# 序列类为 xml 可以使用的特性大全
    C# GUID ToString
    C# GUID ToString
    C# AddRange 添加位置
    C# AddRange 添加位置
    VisualStudio 使用多个环境进行调试
    VisualStudio 使用多个环境进行调试
    C# 使用外部别名
    C# 使用外部别名
  • 原文地址:https://www.cnblogs.com/ZYBGMZL/p/7284440.html
Copyright © 2011-2022 走看看